plsql使用自定义的嵌套表

来源:互联网 发布:英雄无敌for mac 编辑:程序博客网 时间:2024/05/29 09:10

存储过程在使用嵌套表时需要注意:

1.如果嵌套表是直接参照一个物理表的结构创建的,则可以直接使用,如:

create or replace procedure mytest2 is
  CURSOR all_emps IS
    SELECT * FROM emp;
  TYPE emp_table IS TABLE OF  emp%ROWTYPE;
  emps    emp_table;
  I       PLS_INTEGER;
  l_count PLS_INTEGER;
BEGIN
  l_count := 0;
  emps    := emp_table(); --  初始化嵌套表并产生一条空记录
  FOR c1 IN all_emps LOOP
    l_count := l_count + 1;
    emps.EXTEND;
    emps(l_count).empno := c1.empno;
    emps(l_count).ename := c1.ename;
    emps(l_count).job := c1.job;
    emps(l_count).mgr := c1.mgr;
    emps(l_count).hiredate := c1.hiredate;
    emps(l_count).sal := c1.sal;
    emps(l_count).comm := c1.comm;
    emps(l_count).deptno := c1.deptno;
  END LOOP;

  -- clone the first entry five times
  emps.EXTEND(5, 1);

  FOR i IN 1 .. l_count + 5 LOOP
    DBMS_OUTPUT.PUT_LINE(TO_CHAR(emps(i).empno) || '      ');
  END LOOP;
END;

2.如果嵌套表是自己定义的一个record,并根据record创建的嵌套表,则在使用时需要为record初始化,否则会报错,具体如下:

CREATE OR REPLACE TYPE emp_record is OBJECT (
       EMPNO                    NUMBER(4),
       ENAME               VARCHAR2(10),  
       JOB             VARCHAR2(9),
       MGR           VARCHAR2(4),
       HIREDATE                   date,
       SAL                   NUMBER(7,2),
       COMM            number(7,2),
       DEPTNO       number(2)
  );

 

create or replace procedure mytest2 is
  CURSOR all_emps IS
    SELECT * FROM emp;
  TYPE emp_table IS TABLE OF  emp_record;
  emps    emp_table;
  I       PLS_INTEGER;
  l_count PLS_INTEGER;
BEGIN
  l_count := 0;
  emps    := emp_table(); --  初始化嵌套表并产生一条空记录
  FOR c1 IN all_emps LOOP
    l_count := l_count + 1;
    emps.EXTEND;
    emps(l_count) := emp_record(null,null,null,null,null,null,null,null);
    emps(l_count).empno := c1.empno;
    emps(l_count).ename := c1.ename;
    emps(l_count).job := c1.job;
    emps(l_count).mgr := c1.mgr;
    emps(l_count).hiredate := c1.hiredate;
    emps(l_count).sal := c1.sal;
    emps(l_count).comm := c1.comm;
    emps(l_count).deptno := c1.deptno;
  END LOOP;

  -- clone the first entry five times
  emps.EXTEND(5, 1);

  FOR i IN 1 .. l_count + 5 LOOP
    DBMS_OUTPUT.PUT_LINE(TO_CHAR(emps(i).empno) || '      ');
  END LOOP;
END;