定义记录表(或索引表)数据类型与记录类型相似,但它是对记录类型的扩展。它可以处理多行记录,类似于高级中的二维数组,使得可以在PL/SQL中模仿数据库中的表。

定义记录表类型的语法如下:

TYPE table_name IS TABLE OF element_type [NOT NULL]
INDEX BY [BINARY_INTEGER | PLS_INTEGER | VARRAY2];

记录表中的方法:

方法描述
EXISTS(n)如果集合的第n个成员存在,则返回true
COUNT返回已经分配了存储空间即赋值了的成员数量
FIRSTLASTFIRST:返回成员的最低下标值LAST:返回成员的最高下标值
PRIOR(n)返回下标为n的成员的前一个成员的下标。如果没有则返回NULL
NEXT(N)返回下标为n的成员的后一个成员的下标。如果没有则返回NULL
TRIMTRIM:删除末尾一个成员TRIM(n) :删除末尾n个成员
DELETEDELETE:删除所有成员DELETE(n) :删除第n个成员DELETE(m, n) :删除从n到m的成员
EXTENDEXTEND:添加一个null成员EXTEND(n):添加n个null成员EXTEND(n,i):添加n个成员,其值与第i个成员相同
LIMIT返回在varray类型变量中出现的最高下标值

例1:

DECLARE
  TYPE dept_table_type IS TABLE OF
       dept%ROWTYPE INDEX BY BINARY_INTEGER;
  my_dname_table dept_table_type;
  v_count number(2) :=4;
BEGIN
  FOR int IN 1 .. v_count LOOP
    SELECT * INTO my_dname_table(int) FROM dept WHERE deptno=int*10;
  END LOOP;
  FOR int IN my_dname_table.FIRST .. my_dname_table.LAST LOOP
  DBMS_OUTPUT.PUT_LINE('Department number: '||my_dname_table(int).deptno);
  DBMS_OUTPUT.PUT_LINE('Department name: '|| my_dname_table(int).dname);
  END LOOP;
END;

例2&3:按一维数组使用记录表例 & 按二维数组使用记录表**

DECLARE
--定义记录表数据类型
   TYPE reg_table_type IS TABLE OF varchar2(25)
   INDEX BY BINARY_INTEGER;
--声明记录表数据类型的变量
   v_reg_table REG_TABLE_TYPE;
    
BEGIN
   v_reg_table(1) := 'Europe';
   v_reg_table(2) := 'Americas';
   v_reg_table(3) := 'Asia';
   v_reg_table(4) := 'Middle East and Africa';
   v_reg_table(5) := 'NULL';
 
   DBMS_OUTPUT.PUT_LINE('地区名称:'||v_reg_table (1)||'、'
                                    ||v_reg_table (2)||'、'
                                    ||v_reg_table (3)||'、'
                                    ||v_reg_table (4));
   DBMS_OUTPUT.PUT_LINE('第5个成员的值:'||v_reg_table(5));
END;
DECLARE
--定义记录表数据类型
   TYPE emp_table_type IS TABLE OF employees%ROWTYPE
   INDEX BY BINARY_INTEGER;
--声明记录表数据类型的变量
   v_emp_table EMP_TABLE_TYPE;
BEGIN
   SELECT first_name, hire_date, job_id INTO
   v_emp_table(1).first_name,v_emp_table(1).hire_date, v_emp_table(1).job_id
   FROM employees WHERE employee_id = 177;
   SELECT first_name, hire_date, job_id INTO
   v_emp_table(2).first_name,v_emp_table(2).hire_date, v_emp_table(2).job_id
   FROM employees WHERE employee_id = 178;
 
   DBMS_OUTPUT.PUT_LINE('177雇员名称:'||v_emp_table(1).first_name
             ||'  雇佣日期:'||v_emp_table(1).hire_date
             ||'  岗位:'||v_emp_table(1).job_id);
   DBMS_OUTPUT.PUT_LINE('178雇员名称:'||v_emp_table(2).first_name
             ||'  雇佣日期:'||v_emp_table(2).hire_date
             ||'  岗位:'||v_emp_table(2).job_id);
END;
最后修改:2021 年 11 月 17 日
如果觉得我的文章对你有用,请随意赞赏