越到后面实用性越强!所以,学习,贵在坚持!
--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; /