现在的位置: 首页 > 数据库开发经验 > 正文

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

2016年11月10日 数据库开发经验 ⁄ 共 3204字 ⁄ 字号 评论关闭

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

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

【上篇】
【下篇】

抱歉!评论已关闭.

×