前段时间我恰好有关于这些的学习笔记,贴出来大家指点一下: ===================================================== record:该集合可以存储一对多的标量属性。 pl/sql表:是pl/sql代码中的“表”,只存在应用运行期间(内存里),类似“数组”,稀疏的,大小可以动态增长,可以有负下标,但不能存储在数据库表中。 varray:与pl/sql区别是可以在表列中存储,是密集的,不能删除单独记录,不能有负下标,固定大小的集合。 nested table:可以在表列中存储,稀疏的,可以删除单独记录,不能有负下标,大小可变。 1、记录: SQL> declare 2 type emp_rec_t is record( 3 no number, 4 name varchar2(10) 5 ); 6 emp1 emp_rec_t; 7 emp2 emp_rec_t; 8 begin 9 emp1.no:=1; 10 emp1.name:='chennan'; 11 emp2:=emp1; 同一记录类型,可以直接赋值 12 dbms_output.put_line('emp2.no='||emp2.no); 13 dbms_output.put_line('emp2.name='||emp2.name); 14 end; 15 / emp2.no=1 emp2.name=chennan PL/SQL 过程已成功完成。 SQL> SQL> declare 2 type emp_rec_t is record( 3 no number, 4 name varchar2(10) 5 ); 6 7 type mgr_rec_t is record( 8 no number, 9 name varchar2(10) 10 ); 11 12 emp1 emp_rec_t; 13 mgr1 mgr_rec_t; 14 15 begin 16 emp1.no:=1; 17 emp1.name:='chennan'; 18 mgr1:=emp1; -- 尽管字段类型相同,但不是同一记录类型,不能直接赋值 19 end; 20 / mgr1:=emp1; -- 尽管字段类型相同,但不是同一记录类型,不能直接赋值 * ERROR 位于第 18 行: ORA-06550: 第 18 行, 第 7 列: PLS-00382: 表达式类型错误 ORA-06550: 第 18 行, 第 1 列: PL/SQL: Statement ignored 2、pl/sql表: SQL> declare 2 -- 自定义记录类型 3 type rec_t is record( 4 empno number, 5 ename varchar2(10) 6 ); 7 -- 数组类型 8 type varray_t1 is table of varchar(10) index by binary_integer; -- 单字段数组 9 type varray_t2 is table of rec_t index by binary_integer; -- 自定义多字段数组 10 type varray_t3 is table of emp%rowtype index by binary_integer; -- 表的行记录数组 11 -- 数组变量 12 varray1 varray_t1; 13 varray2 varray_t2; 14 varray3 varray_t3; 15 i integer; 16 j integer; 17 begin 18 i:=0; 19 for x in (select * from emp where rownum<4) loop 20 varray1(i):=x.ename; 21 varray2(i).empno:=x.empno; 22 varray2(i).ename:=x.ename; 23 varray3(i):=x; 24 i:=i+1; 25 end loop; 26 dbms_output.put_line('--------------'); 27 for i in 0 .. varray1.count-1 loop 28 dbms_output.put_line('varray1('||i||')='||varray1(i)); 29 end loop; 30 dbms_output.put_line('--------------'); 31 for i in 0 .. varray2.count-1 loop 32 dbms_output.put_line('varray2('||i||').empno='||varray2(i).empno); 33 dbms_output.put_line('varray2('||i||').ename='||varray2(i).ename); 34 end loop; 35 dbms_output.put_line('--------------'); 36 for i in 0 .. varray3.count-1 loop 37 dbms_output.put_line('varray3('||i||').empno='||varray3(i).empno); 38 dbms_output.put_line('varray3('||i||').ename='||varray3(i).ename); 39 dbms_output.put_line('varray3('||i||').job='||varray3(i).job); 40 -- ...... 41 end loop; 42 dbms_output.put_line('--------------'); 43 i:=varray3.first; 44 while i is not null loop 45 dbms_output.put_line('varray3('||i||').ename='||varray3(i).ename); 46 i:=varray3.next(i); 47 end loop; 48 dbms_output.put_line('--------------'); 49 i:=varray3.first; 50 j:=varray3.last; 51 while i<=j loop 52 dbms_output.put_line('varray3('||i||').ename='||varray3(i).ename); 53 i:=varray3.next(i); 54 end loop; 55 dbms_output.put_line('----- before delete -----'); 56 dbms_output.put_line('varray3 has '||varray3.count||' rows'); 57 varray3.delete(1); 58 dbms_output.put_line('delete rows(1) then varray3 has '||varray3.count||' rows'); 59 dbms_output.put_line('----- now varray3 :----'); 60 i:=varray3.first; 61 j:=varray3.last; 62 while i<=j loop 63 dbms_output.put_line('varray3('||i||').ename='||varray3(i).ename); 64 i:=varray3.next(i); 65 end loop; 66 varray3.delete; 67 dbms_output.put_line(' ----- when delete all,now varray3 has '||varray3.count||' rows'); 68 end; 69 / -------------- varray1(0)=SMITH varray1(1)=ALLEN varray1(2)=WARD -------------- varray2(0).empno=7369 varray2(0).ename=SMITH varray2(1).empno=7499 varray2(1).ename=ALLEN varray2(2).empno=7521 varray2(2).ename=WARD -------------- varray3(0).empno=7369 varray3(0).ename=SMITH varray3(0).job=CLERK varray3(1).empno=7499 varray3(1).ename=ALLEN varray3(1).job=SALESMAN varray3(2).empno=7521 varray3(2).ename=WARD varray3(2).job=SALESMAN -------------- varray3(0).ename=SMITH varray3(1).ename=ALLEN varray3(2).ename=WARD -------------- varray3(0).ename=SMITH varray3(1).ename=ALLEN varray3(2).ename=WARD ----- before delete ----- varray3 has 3 rows delete rows(1) then varray3 has 2 rows ----- now varray3 :---- varray3(0).ename=SMITH varray3(2).ename=WARD ----- when delete all,now varray3 has 0 rows PL/SQL 过程已成功完成。 SQL> 3、varrays SQL> create type emp_type as object( 2 empno number, 3 ename varchar2(10) 4 ); 5 / 类型已创建。 SQL> create type emp_type_list as varray(50) of emp_type; 2 / 类型已创建。 SQL> create table myemp( 2 deptno number, 3 deptname varchar2(10), 4 manager emp_type, 5 employees emp_type_list 6 ); 表已创建。 SQL> insert into myemp(deptno,deptname,manager,employees) values( 2 10,'ACCOUNTING',emp_type(7782,'CLARK'),emp_type_list(emp_type(7934,'MILLER'),emp_type(1223,'TEST'))); 已创建 1 行。 SQL> insert into myemp(deptno,deptname,manager,employees) values( 2 20,'RESEARCH',emp_type(7566,'JONES'),emp_type_list(emp_type(7902,'FORD'),emp_type(7788,'SCOTT'),emp_type(4567,'OTHER'))); 已创建 1 行。 SQL> col employees for a100 SQL> col manager for a30 SQL> select * from myemp; DEPTNO DEPTNAME MANAGER(EMPNO, ENAME) EMPLOYEES(EMPNO, ENAME) ---------- ---------- ------------------------------ ---------------------------------------------------------------------------------------- 10 ACCOUNTING EMP_TYPE(7782, 'CLARK') EMP_TYPE_LIST(EMP_TYPE(7934, 'MILLER'), EMP_TYPE(1223, 'TEST')) 20 RESEARCH EMP_TYPE(7566, 'JONES') EMP_TYPE_LIST(EMP_TYPE(7902, 'FORD'), EMP_TYPE(7788, 'SCOTT'), EMP_TYPE(4567, 'OTHER')) 已选择2行。