处理单行单列的数据,开发人员可以使用标量变量,为了处理单行多列的数据;开发人员使用PL/SQL记录;处理单列多行数据,开发人员可以使用PL/SQL集合;处理多行多列数据,开发人员可以使用PL/SQL记录表。
oracle复合数据类型
1,使用PL/SQL记录和%ROWTYPE属性。
2,使用索引表,嵌套表和变长数组(VARRAY)。
3,使用PL/SQL记录表。
4,使用FORALL语句和BULK COLLECT子句。
5,在嵌套表上使用集合操作符,在FORALL语句中使用INDICES OF 子句和VALUES OF子句。
定义记录
TYPE type_name IS RECORD (field_declaration[,field_declaration]...);
identifier_names type_name;
examples:
TYPE emp_record_type IS RECORD(NAME emp.ename%TYPE,salary emp.sal%TYPE,dno emp.deptno%TYPE);
emp_record emp_record_type;
使用%rowtype属性可以基于表或视图定义记录变量。
identifier_names table_name%ROWTYPE;
identifier_names view_name%ROWTYPE;
在SELECT INTO语句中使用记录成员
CREATE OR REPLACE PROCEDURE pro_record2(v_empno INTEGER)
IS
TYPE emp_record_type IS RECORD(NAME emp.ename%TYPE,salary emp.sal%TYPE,dno emp.deptno%TYPE);
emp_record emp_record_type;
BEGIN
SELECT ename,sal INTO emp_record.name,emp_record.salary FROM emp WHERE empno = v_empno;
dbms_output.put_line(emp_record.name);
END;
在VALUES语句中使用PL/SQL记录
DECLARE dept_record dept%ROWTYPE;
BEGIN
dept_record.deptno := 50;
dept_record.dname := 'administrator';
dept_record.loc := 'beijing';
INSERT INTO dept VALUES dept_record;
END;
在VALUES子句中使用记录成员
DECLARE dept_record dept%ROWTYPE;
BEGIN
dept_record.deptno := 60;
dept_record.dname := 'SALES';
INSERT INTO dept(deptno,dname) VALUES (dept_record.deptno,dept_record.dname);
END;
------
PL/SQL集合
PL/SQL集合类型包括索引表(PL/SQL table),嵌套表(nested table),变长数据(varray)等三种类型。
索引表也称PL/SQL表,元素个数没有限制,下标可以为负值。索引表只能作为PL/SQL复合数据类型使用,而不能作为表列的数据类型使用。
定义语法:
TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY key_type;
identifier type_name;
key_type允许使用的类型binary_integer,pls_integer,varchar2,用于指定索引表元素下标的数据类型。
CREATE OR REPLACE PROCEDURE PRO_TABLE_TYPE1(V_NO IN INTEGER) IS
TYPE ENAME_TABLE_TYPE IS TABLE OF EMP.EMPNO%TYPE INDEX BY BINARY_INTEGER;
ENAME_TABLE_NAME ENAME_TABLE_TYPE;
BEGIN
SELECT ENAME INTO ENAME_TABLE_NAME(-1) FROM EMP WHERE EMPNO = V_NO;
END;
嵌套表的元素下标从1开始,并且元素个数没有限制。
定义语法:
TYPE type_name IS TABLE OF element_type;
identifier type_name;
identifier为嵌套表变量。
变长数据(VARRAY)
TYPE type_name IS VARRAY(size_limit) OF element_type [NOT NULL];
identifiers type_name;
size_limit用于指定varray元素的最大个数;
使用varray元素时,必须要使用其构造方法初始化varray元素。
DECLARE TYPE ename_table_type IS VARRAY(20) OF emp.ename%TYPE;
ename_table ename_table_type := ename_table_type('A','A');
PL/SQL记录表
实例:
DECLARE
TYPE emp_table_type IS TABLE OF emp%ROWTYPE INDEX BY BINARY_INTEGER;
emp_table emp_table_type;
BEGIN
SELECT * INTO emp_table(1) FROM emp WHERE empno = &NO;
dbms_output.put_line('雇员姓名:'||emp_table(1).ename);
dbms_output.put_line('雇员工资:'||emp_table(1).sal);
END;
批量绑定
forall语句只使用于执行批量DML操作,BULK collect子句用于取得批量数据,该子句只能用于SELECT语句,fetch语句和
DML返回子句中。
创建的实例表:
CREATE TABLE demo(ID NUMBER(6) PRIMARY KEY,NAME VARCHAR2(10));
批量绑定实例:
CREATE OR REPLACE PROCEDURE pro_bulk2
IS
TYPE id_table_type IS TABLE OF NUMBER(6) INDEX BY BINARY_INTEGER;
TYPE name_table_type IS TABLE OF VARCHAR2(10) INDEX BY BINARY_INTEGER;
id_table id_table_type;
name_table name_table_type;
start_time NUMBER(10);
end_time NUMBER(10);
BEGIN
FOR i IN 1..5000 LOOP
id_table(i) := i;
NAME_table(i) := 'Name' || to_char(i);
END LOOP;
start_time := dbms_utility.get_time;
FORALL i IN 1..id_table.count
INSERT INTO demo VALUES(id_table(i),name_table(i));
COMMIT;
END_time := dbms_utility.get_time;
dbms_output.put_line('总计时(s):' || to_char((end_time-start_time)/100));
END;