此书及其相关资源下载方法:关注微信公众号,点击功能介绍-书籍链接下载,即可获取
说明
本文主要介绍如下知识点:
- 集合类型
6.1.集合简介
6.2.定义索引表
6.3.操纵索引表
6.4.定义嵌套表
6.5.操纵嵌套表
6.6.数据库中的嵌套表
6.7.定义变长数组
6.8.操纵变长数组
6.9.数据库中的变长数组
6.10.选择集合类型
6.1.集合简介
6.2 定义索引表
6.3 操纵索引表
DECLARE
--定义索引表(使用数字)
TYPE idx_deptno_table IS TABLE OF NUMBER(2) INDEX BY VARCHAR2(20);
v_deptno idx_deptno_table;
--定义索引表(使用字符串)
TYPE idx_deptno_table2 IS TABLE OF VARCHAR2(20) INDEX BY PLS_INTEGER;
v_deptno2 idx_deptno_table2;
--定义索引表(使用%TYPE)
TYPE idx_deptno_table3 IS TABLE OF hyz_dept.deptno%TYPE INDEX BY hyz_dept.dname%TYPE;
v_deptno3 idx_deptno_table3;
BEGIN
--为索引表赋值
v_deptno('财务部') := 10;
v_deptno('研究部') := 20;
v_deptno('销售部') := 30;
v_deptno2(10) := '财务部';
v_deptno2(20) := '研究部';
v_deptno2(30) := '销售部';
v_deptno3('财务部') := 10;
v_deptno3('研究部') := 20;
v_deptno3('销售部') := 30;
dbms_output.put_line('销售部编号' || v_deptno('销售部'));
dbms_output.put_line('研究部编号' || v_deptno('研究部'));
dbms_output.put_line('财务部编号' || v_deptno('财务部'));
dbms_output.put_line('30编号是' || v_deptno2(30));
dbms_output.put_line('20编号是' || v_deptno2(20));
dbms_output.put_line('10编号是' || v_deptno2(10));
dbms_output.put_line('销售部编号' || v_deptno3('销售部'));
dbms_output.put_line('研究部编号' || v_deptno3('研究部'));
dbms_output.put_line('财务部编号' || v_deptno3('财务部'));
END;
6.4定义嵌套表
6.5操纵嵌套表
代码举例
--初始化嵌套表例子
DECLARE
TYPE emp_name_table IS TABLE OF VARCHAR(20); --定义嵌套表(员工名称)
emp_name_info emp_name_table := emp_name_table('小王', '小明'); --初始化嵌套表
BEGIN
dbms_output.put_line('员工1:' || emp_name_info(1));
dbms_output.put_line('员工1:' || emp_name_info(2));
END;
--未初始化的嵌套表例子(一)
DECLARE
TYPE deptno_table IS TABLE OF NUMBER(2); --定义嵌套表(部门名称)
deptno_info deptno_table; --未初始化的嵌套表
BEGIN
IF deptno_info IS NULL --初始值为NULL
THEN
deptno_info := deptno_table();
END IF;
deptno_info.extend(5); --扩充五个
FOR i IN 1 .. 5 LOOP
deptno_info(i) := i * 10;
dbms_output.put_line('部门号:' || deptno_info(i));
END LOOP;
dbms_output.put_line('部门总数:' || deptno_info.count);
END;
--未初始化的嵌套表例子(二)
--例一中的extend语法和如下语句语法完全一致
DECLARE
TYPE deptno_table IS TABLE OF NUMBER(2); --定义嵌套表(部门名称)
deptno_info deptno_table; --未初始化的嵌套表
BEGIN
IF deptno_info IS NULL --初始值为NULL
THEN
deptno_info := deptno_table(10, 20, 30, 40, 50); --扩充五个
END IF;
FOR i IN 1 .. 5 LOOP
deptno_info(i) := i * 10;
dbms_output.put_line('部门号:' || deptno_info(i));
END LOOP;
dbms_output.put_line('部门总数:' || deptno_info.count);
END;
6.6 数据库中的嵌套表
语法:
CREATE OR REPLACE TYPE type_name
AS TABLE OF element_type [ NOT NULL ] ;
6.7 .定义变长数组
6.8 操纵变长数组
DECLARE
TYPE projectlist IS VARRAY(50) OF VARCHAR2(16); --定义变长数组(项目列表)
project_list projectlist := projectlist('OK', 'HELLO', 'ERP'); --定义一个初始化的变长数组
TYPE empno_type IS VARRAY(50) OF NUMBER(4); --定义变长数组(项目列表)
empno_list empno_type; --定义一个未初始化的变长数组
BEGIN
dbms_output.put_line(project_list(3));
project_list.extend; --扩展第四个元素
project_list(4) := 'LIST'; --赋值到第四个元素
empno_list := empno_type(300, 301, 302, 303, NULL);
empno_list(5) := 304;--为第五个元素赋值,原值为NULL
dbms_output.put_line(empno_list(5));
END;
6.9 数据库中的变长数组
6.10 选择集合类型
嵌套表和索引表的相似之处
- 嵌套表自索引表扩展而来, 因此嵌套表包含索引表的所有表属性。
- 嵌套表与索引表都是使用下标对集合中的元素进行访问。
- 嵌套表与索引表的数据类型具有相同的结构。
嵌套表和索引表的不同点
- 嵌套表可以存储到数据库中, 而索引表不能, 因此如果表类型需要保存到数据库
中. 应该考虑使用嵌套表。- 嵌套表合法的下标范围是 1~214748361 下标不能为负数; 而索引表可以为负下标, 范围为-2l47483647~2147483647. 因此如果考虑带负数的下标,应该使用索引表。
- 索引表在每次调用语句块或在包初始化时在内存中自动构建, 能够保存容量不固
定的信息'因为它的长度是大小可变的, 其值不能为 NULL; 而嵌套表是一种对
象类型, 如果不显式使用构造函数, 则其值为 NULL, 可以使用 IS NULL 进行
检查。- 嵌套表可以使用其他的方法,比如 EXTEND和TRIM 等方法进行操作,而索引表
不需要。- PL/SQL会自动在主机数组和索引表之间进行转换, 而嵌套表不能在主机数组之间
进行转换。
变长数组与嵌套表共同点
- 变长数组与嵌套表都使用下标符号对单个元素进行访问,在使用前都必须使用构造函数进行初始化。
- 都可以存储在数据库表中, 都可以应用集合方法。
变长数组与嵌套表区别(决定了是否选择此种类型)
- 变长数组一旦声明, 元素数目就被固定,而嵌套表没有一个明确的大小上限。
- 当存储到数据库中时, 变长数组保持了元素的排序和下标的值,而嵌套表则不同。