第一个Associative arrays,可看成数据字典,有key,value两列。key值可以是任意数字和字符串,value值可以是任意对象、甚至是collection类型的对象。
第二个Nested tables,可看着一维数组,使用数字编号可以依次操作每个数组元素。
第三个Varrays,可看着预先定义好长度的一维数组,使用数字编号可以依次操作每个数组元素。
这三类的定义和初始化的方法如下:
type typ_dict is table of varchar2(100) index by varchar2(10);
type typ_array is table of integer;
type typ_varray is varray(3) of varchar2(10);
v_dict typ_dict;
v_array typ_array := typ_array();
v_varray typ_varray := typ_varray(null, null, null);
这些类除掉普通的数据类型外,还有遇到object类型。这点和面向对象编程的语言有些相似,但功能没那么强大。
例如定义一个有多个VARCHAR2组成的对象。
CREATE OR REPLACE TYPE obj_food AS OBJECT (
name VARCHAR2( 100 )
, food_group VARCHAR2( 100 )
, color VARCHAR2( 100 )
);
CREATE TYPE typ_array_food IS table OF obj_food;
l_food typ_array_food := typ_array_food();
示例一,
DECLARE
l_food typ_array_food := typ_array_food();
BEGIN
l_food.extend(3);
l_food(1) := obj_food('Scrambled Eggs', 'Protein', 'Yellow');
l_food(2) := obj_food('Deluxe Salad', 'Vegetables', 'Mostly Green');
l_food(3) := obj_food('Tofu and Rice', 'Protein', 'White');
dbms_output.put_line('food(1)=' || l_food(1).name);
for j in 1 .. l_food.count loop
dbms_output.put_line('food('||j||')=' || l_food(j).name);
end loop;
END;
结果如下:
SQL> set serveroutput on
SQL> /
food(1)=Scrambled Eggs
food(1)=Scrambled Eggs
food(2)=Deluxe Salad
food(3)=Tofu and Rice
PL/SQL procedure successfully completed
这个例子是一维数组的例子,如果我们要使用二维数组,又该如何定义?
前提是先在数据库中定义一个二维数组的类型
CREATE TYPE typ_array_foods IS table OF typ_array_food;
然后开发示例程序,如下:
DECLARE
l_food typ_array_food := typ_array_food();
l_foods typ_array_foods := typ_array_foods();
BEGIN
l_food.extend(3);
l_food(1) := obj_food('Scrambled Eggs', 'Protein', 'Yellow');
l_food(2) := obj_food('Deluxe Salad', 'Vegetables', 'Mostly Green');
l_food(3) := obj_food('Tofu and Rice', 'Protein', 'White');
l_foods.extend(1);
l_foods(1) := l_food;
dbms_output.put_line('foods(1,1)=' || l_foods(1)(1).name);
l_foods.extend(1);
l_foods(2) := l_food;
l_food.trim(l_food.count);
for i in 1 .. 2 loop
l_food.extend(1);
l_food(i) := obj_food('Scrambled Eggs '||i, 'Protein', 'Yellow');
end loop;
l_foods.extend(1);
l_foods(3) := l_food;
for i in 1 .. l_foods.count loop
for j in 1 .. l_foods(i).count loop
dbms_output.put_line('foods('||i||','||j||')=' || l_foods(i)(j).name);
end loop;
end loop;
END;
通过collection的trim、extend等操作,我们很容易理解它。在现实开发中,多数情况下使用的类型是Nested tables。
在查询数据,需要进行条件判断时,一般我们使用CASE...WHEN实现,当判断条件为相等时,除了使用CASE...WHEN实现,还可以使用DECODE函数。若要使用like、>、<等其他判断条件时,就只能使用CASE...WHEN实现了。下面就解释下DECODE()函数的用法。
DECODE()使用方法:
decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)
DECODE()含义说明:
IF 条件=值1 THEN
RETURN(翻译值1)
ELSIF 条件=值2 THEN
RETURN(翻译值2)
......
ELSIF 条件=值n THEN
RETURN(翻译值n)
ELSE
RETURN(缺省值)
END IF
附上DBCODE()官方说明
:
DECODE scalar function
.--------------------------------------. V | >>-DECODE--(--expression1----,--expression2--,--result-expression-+--+--------------------+--)->< '-,--else-expression-'
The schema is SYSIBM.
The DECODE function compares each expression2 to expression1. If expression1 is equal to expression2, or both expression1 andexpression2 are null, the value of the following result-expresssion is returned. If no expression2 matches expression1, the value ofelse-expression is returned; otherwise a null value is returned.
- A null value of expression1 will match a corresponding null value of expression2.
- If the NULL keyword is used as an argument in the DECODE function, it must be cast to an appropriate data type.
Examples:
DECODE (c1, 7, 'a', 6, 'b', 'c')achieves the same result as the following CASE expression:
CASE c1 WHEN 7 THEN 'a' WHEN 6 THEN 'b' ELSE 'c' END
DECODE (c1, var1, 'a', var2, 'b')where the values of c1, var1, and var2 could be null values, achieves the same result as the following CASE expression:
CASE WHEN c1 = var1 OR (c1 IS NULL AND var1 IS NULL) THEN 'a' WHEN c1 = var2 OR (c1 IS NULL AND var2 IS NULL) THEN 'b' ELSE NULL END
SELECT ID, DECODE(STATUS, 'A', 'Accepted',
1、首先新建一个bat文件,用来执行数据库备份命令。
内容如下:(路径、IP、文件名等按需指定)
@ECHO OFF @set DirName=%date:~0,7% @set FileName=%date:~0,10%_DB_NAME.backup @if %date:~8,2% == 01 (md E:\DBbackup\"%DirName%") @if not exist E:\DBbackup\"%DirName%" (md E:\DBbackup\"%DirName%") @if not exist %DirName% (md %DirName%) "D:\PostgreSQL\9.1\bin\pg_dump.exe" -i -h xxx.xxx.xxx.xxx -p 5432 -U postgres -Ft -f E:\DBbackup\%FileName% DB_NAME @ECHO ON
2、执行上边的bat时会要求输入数据库密码,为解决该问题,
需创建postgres密码文件“pgpass.conf”,
内容为“xxx.xxx.xxx.xxx:5432:DB_NAME:postgres:PASSWORD”
放在“D:\PostgreSQL\9.1\data”路径下,
并新建环境变量【PGPASSFILE】值为“D:\PostgreSQL\9.1\data\pgpass.conf”,这样运行时就不需要输入密码了。
3、最后把bat放到任务计划中,每天执行即可。