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

来源:互联网 发布:Linux中文系统 编辑:程序博客网 时间:2024/06/07 22:37

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

--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;/

0 0
原创粉丝点击