學習筆記:關於PL/SQL 集合類型record、pl/sql表、varray、nested table

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行。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章