PL/SQL数据类型主要包括标量数据类型和复合数据类型。
标量数据类型比较简单,不在详细说明。
复合数据类型主要包括PL/SQL记录、PL/SQL表(索引表)、嵌套表和变长数组(VARRAY)。下边详细描述。
TYPE type_name IS RECORD(
field_name data_type[[NOT NULL]{:=DEFAULT} value]
[, ...]
);
示例:自定义PL/SQL记录
DECLARE TYPE emp_type IS RECORD( empno NUMBER(4), ename VARCHAR2(10), sal NUMBER(7,2) ); one_emp emp_type; BEGIN SELECT empno,ename,sal INTO one_emp FROM scott.emp where empno=7900; DBMS_OUTPUT.PUT_LINE('员工编号为:'||one_emp.empno); DBMS_OUTPUT.PUT_LINE('员工姓名为:'||one_emp.ename); DBMS_OUTPUT.PUT_LINE('员工工资为:'||one_emp.sal); END;
PL/SQL记录的使用方法:在ORACLE9i以前,如果在内嵌sql语句中使用PL/SQL记录变量,那么只有SELECT INTO语句可以直接引用记录变量,而INSERT,UPDATE和DELETE语句则只能引用记录成员。不能直接引用记录变量。从9i开始,不仅可以在select中直接使用记录变量,也可以在INSERT和UPDATE语句中直接引用记录变量。
(1)在SELECT INTO 中使用PL/SQL记录。既可以使用记录变量,也可以使用记录变量成员。
示例一:使用记录变量
DECLARE TYPE emp_record_type IS RECORD( name scott.emp.ename%TYPE, sal scott.emp.sal%TYPE, dno scott.emp.deptno%TYPE ); emp_record emp_record_type; BEGIN SELECT ename,sal,deptno INTO emp_record FROM scott.emp WHERE empno=7900; DBMS_OUTPUT.PUT_LINE(emp_record.name); DBMS_OUTPUT.PUT_LINE(emp_record.sal); DBMS_OUTPUT.PUT_LINE(emp_record.dno); END;
示例二:使用记录成员变量
DECLARE TYPE emp_record_type IS RECORD( name scott.emp.ename%TYPE, sal scott.emp.sal%TYPE, dno scott.emp.deptno%TYPE ); emp_record emp_record_type; BEGIN SELECT ename,sal,deptno INTO emp_record.name,emp_record.sal,emp_record.dno FROM scott.emp WHERE empno=7900; DBMS_OUTPUT.PUT_LINE(emp_record.name); DBMS_OUTPUT.PUT_LINE(emp_record.sal); DBMS_OUTPUT.PUT_LINE(emp_record.dno); END;
(2)在INSERT 语句中使用PL/SQL记录
示例一:在VALUES子句中使用记录变量
DECLARE dept_record scott.dept%ROWTYPE; BEGIN dept_record.deptno:=50; dept_record.dname:='adninistrator'; dept_record.loc:='BJ'; INSERT INTO scott.dept VALUES dept_record; END;
示例二:在VALUES子句中使用记录成员
DECLARE dept_record scott.dept%ROWTYPE; BEGIN dept_record.deptno:=51; dept_record.dname:='sales'; dept_record.loc:='BJ'; INSERT INTO scott.dept VALUES (dept_record.deptno,dept_record.dname, dept_record.loc); END;
2. PL/SQL表(索引表):PL/SQL表也称索引表,用于处理PL/SQL数组的数据类型。但是索引表与高级语言的数组是有区别的:高级语言数组的元素个数是有限制的,并且下标不能为负值;而索引表的元素个数没有限制,并且下标可以为负值。定义索引表的语法:
TYPE type_name IS TABLE OF element_type
[NOT NULL] INDEX BY key_type;
identifier type_name;
其中索引表下标不仅可以使用BINARY_INTEGER和PLS_INTEGER,而且可以使用VARCHAR2。
示例一:在索引表中使用BINARY_INTEGER和PLS_INTEGER
DECLARE TYPE ename_table_type IS TABLE OF scott.emp.ename%TYPE INDEX BY BINARY_INTEGER; ename_table ename_table_type; BEGIN SELECT ename INTO ename_table(-1) FROM scott.emp WHERE empno=7900; DBMS_OUTPUT.PUT_LINE(ename_table(-1)); END;
3. 嵌套表:也是一种用于处理PL/SQL数组的数据类型。同样嵌套表和高级语言的数组也是有区别的:高级语言数组的元素下标从0或者1开始,并且元素个数是有限制的;而嵌套表的元素下标从1开始,并且元素个数没有限制;另外,高级语言的数组元素是有顺序的,而嵌套表中的数组元素可以是无序的。索引包类型不能作为表列的数组类型使用,但是嵌套表类型是可以作为表列的数组类型使用的。当使用嵌套表之前,必须首先使用起构造方法初始化嵌套表。定义嵌套表的语法格式:
TYPE type_name IS TABLE OF element_type;
identifier type_name;
示例一;在PL/SQL块中使用嵌套表
DECLARE TYPE ename_table_type IS TABLE OF scott.emp.ename%TYPE; ename_table ename_table_type; BEGIN ename_table:=ename_table_type('mary','lili','tomm'); SELECT ename INTO ename_table(2) FROM scott.emp WHERE empno=7900; dbms_output.put_line(ename_table(2)); END;
4. 变长数组(VARRAY):也是一种用于处理PL/SQL数组的数据类型,它也可以作为表列的数据类型使用。该数据类型与高级语言数组非常相似,起元素下标从1开始,并且元素的最大个数是又限制的。定义语法:
TYPE type_name IS VARRAY(size) OF element_type [NOT NULL];
identifier type_name;
5. PL/SQL记录表:PL/SQL变量用于处理单行单列数据,PL/SQL记录用于处理单行多列数据,PL/SQL集合用户处理多行多列数据。为了在PL/SQL块中处理多行多列数据,我们可以使用记录表。PL/SQL记录表结合了PL/SQL记录和PL/SQL集合的优点,从而可以有效处理多行多列的数据。
示例:
DECLARE TYPE emp_table_type IS TABLE OF scott.emp%ROWTYPE INDEX BY BINARY_INTEGER; emp_table emp_table_type; BEGIN SELECT * INTO emp_table(1) FROM scott.emp WHERE empno=7900; dbms_output.put_line(emp_table(1).ename); END;