源码-Oracle数据库管理-第十四章-记录与集合-Part 3(使用集合类型)

时间:2021-10-30 17:00:14

越到后面实用性越强!所以,学习,贵在坚持!

--14.2 使用集合类型
--14.2.1 集合的分类
--14.2.2 定义关联数组
--代码14.16 在update语句中使用记录类型
DECLARE
-- 雇佣日期索引表集合
TYPE hiredate_idxt IS TABLE OF DATE INDEX BY PLS_INTEGER;
-- 部门编号集合
TYPE deptno_idxt IS TABLE OF dept.deptno%TYPE NOT NULL
   INDEX BY PLS_INTEGER;
--记录类型的索引表,这个结构允许在PL/SQL程序中创建本的一个本地副本
TYPE emp_idxt IS TABLE OF emp%ROWTYPE
   INDEX BY NATURAL;
-- 由部门名称标识的部门记录的集合
TYPE deptname_idxt IS TABLE OF dept%ROWTYPE
   INDEX BY dept.dname%TYPE;
-- 定义集合的集合
TYPE private_collection_tt IS TABLE OF deptname_idxt
   INDEX BY VARCHAR2(100);
BEGIN
   NULL;
END;


--14.2.3 操作关联数组
--代码14.17 定义与使用关联数组
DECLARE
   --定义一个关联数组,元素类型为VARCHAR2(12),下标类型为PLS_INTEGER
   TYPE idx_table IS TABLE OF VARCHAR2(12)
      INDEX BY PLS_INTEGER;                 
   v_emp   idx_table;                          --定义关联数组变量
   v_idx  PLS_INTEGER;
BEGIN
   v_emp (1) := '史密斯';                      --随机的为索引表赋值
   v_emp (20) := '克拉克';
   v_emp (40) := '史瑞克';
   v_emp (-10) := '杰瑞';
  v_idx := v_emp.FIRST;                        --获取关联数组中第1个元素的下标    
  WHILE v_idx IS NOT NULL                    --循环关联数组
  LOOP
    DBMS_OUTPUT.put_line                       --输出关联数组的值
      ('关联数组v_emp下标' || v_idx || ' 所在的值是 ' || v_emp(v_idx));
    v_idx := v_emp.NEXT(v_idx);                --获取关联数组下一个元素的下标
  END LOOP;   
END;


--代码14.18 使用字符串下标的关联数组
DECLARE
   --定义以VARCHAR2作为索引键的关联数组
   TYPE idx_empsal_table IS TABLE OF NUMBER(8)
      INDEX BY VARCHAR2 (20);
   --声明记录类型的变量
   v_empsal idx_empsal_table;
BEGIN
   --为关联数组赋值
   v_empsal('史密斯') := 5000;
   v_empsal('李维二') := 8000;
   v_empsal('张大千') := 3000;
   --引用关联数组的内容
   DBMS_OUTPUT.put_line ('员工史密斯的工资为:' || v_empsal ('史密斯'));
END;


--14.2.4 定义嵌套表
--代码14.19 嵌套表定义和表变量声明
DECLARE
   TYPE dept_table IS TABLE OF dept%ROWTYPE;              --部门信息嵌套表
   TYPE emp_name_table IS TABLE OF VARCHAR2 (20);         --员工名称嵌套表
   TYPE deptno_table IS TABLE OF NUMBER (2);                --部门编号嵌套表
   dept_info       dept_table;                                 --声明嵌套表变量
   --声明并初始化嵌套表变量
   emp_name_info   emp_name_table := emp_name_table ('张小3', '李斯特');
   deptno_info     deptno_table   := deptno_table ();          --声明一个空的嵌套表
BEGIN
   NULL;
END;


--14.2.5 操作嵌套表
--代码14.20 使用嵌套表示例
DECLARE
   TYPE emp_name_table IS TABLE OF VARCHAR2 (20);          --员工名称嵌套表
   TYPE deptno_table IS TABLE OF NUMBER (2);                  --部门编号嵌套表
   deptno_info     deptno_table;
   emp_name_info   emp_name_table := emp_name_table ('张小3', '李斯特');
BEGIN
   DBMS_OUTPUT.put_line ('员工1:' || emp_name_info (1));       --访问嵌套表元素
   DBMS_OUTPUT.put_line ('员工2:' || emp_name_info (2));
   IF deptno_info IS NULL                                       --判断嵌套表是否被初始化
   THEN
      deptno_info := deptno_table ();                          --如果未初始化则调用构造函数
   END IF;
   deptno_info.EXTEND(5);                                      --扩充元素的个数
   FOR i IN 1 .. 5                                               --循环遍历嵌套表元数个数
   LOOP
      deptno_info (i) := i * 10;
   END LOOP;
   --显示部门个数
   DBMS_OUTPUT.put_line ('部门个数:' || deptno_info.COUNT);
END;



--初始化嵌套表,传入NULL值。
   IF deptno_info IS NULL                                 --判断嵌套表是否被初始化
   THEN
      deptno_info := deptno_table (NULL,NULL,NULL,NULL,NULL);
   END IF;


--代码14.21 使用方案级别的嵌套表
--定义一个方案级别的嵌套表类型
CREATE OR REPLACE TYPE t_deptno_type IS TABLE OF NUMBER;
/
--定义一个过程print_deptno,它的形式参数中包含了t_deptno_type的类型
CREATE OR REPLACE PROCEDURE print_deptno (nt t_deptno_type) IS
  i  NUMBER;
BEGIN   
  i := nt.FIRST;               --获取第1个元素的下标,如果不存在则返回NULL
  IF i IS NULL THEN            --如果嵌套表为NULL,则提示用户未分配任何元素
    DBMS_OUTPUT.put_line('嵌套表中未分配任何元素');
  ELSE
    WHILE i IS NOT NULL LOOP   --循环判断下标值是否为NULL,输出元素值
      DBMS_OUTPUT.put('下标.(' || i || ') 的部门编号是: '); 
      DBMS_OUTPUT.put_line(nt(i));
      i := nt.NEXT(i);         --使用NEXT获取下一个有效的元素的下标
    END LOOP;
  END IF; 
  DBMS_OUTPUT.put_line('---');
END print_deptno;
/
DECLARE
  nt t_deptno_type := t_deptno_type(); --初始化1个空的嵌套表
BEGIN
  print_deptno(nt);                   --输出嵌套表信息
  nt := t_deptno_type(90, 9, 29, 58);   --重新初始化嵌套表,使之具有4个元素  
  print_deptno(nt);                   --输出嵌套表信息
  nt.DELETE(1);                   --删除嵌套表中下标为1的元素。
  print_deptno(nt);    
  --DBMS_OUTPUT.put_line(nt(1));    --这行代码将产生异常
  --nt(1):=10;                       --用新值替换掉被删除的值是正常的
END;
/