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行。