嵌套表是对索引表的扩展,与索引表最大的不同在于嵌套表可以存储到ORACLE数据库表中,
而索引表仅仅是内存表。而且,嵌套表必须使用其构造方法对嵌套表进行初始化。嵌套表
没有INDEX BY子句,这个与索引表直接最明显的区别,因为嵌套表必须用有序的关键字创建,
而且关键字不能为负数。
索引表
7369 NULL 7521 7566 7902 7788
1 2 -5 120 KEY1 10
下标可以为正数,负数或字符串
嵌套表
7369 NULL 7521 7566 7902 7788
1 2 3 4 5 6
下标必须为有序类型,不可以为负数,只能从1开始
高级语言数组
7369 NULL 7521 7566 7902 7788
1 2 3 4 5 6
下标只能为从0或1开始的连续数字
嵌套表的定义语法:
TYPE type_naem AS TABLE OF element_type[NOT NULL]
语法中各个部分的含义如下所示:
element_name:不超过30字符。
element_type:用于指定嵌套表元素的数据类型,可以是用户定义的对象类型,也可以是
使用%TYPE的表达好似,但是不可以是BOOLEAN,NCHAR,NCLOB,NVARCHAR2或REF CURSOR.
当使用嵌套表元素时,必须首先使用构造语法初始化嵌套表。
8.2.5
操纵嵌套表
由于在嵌套表使用之前必须进行构造,为构造的嵌套表被自动地赋初始值NULL,这与索引表不同,索引表
只是一种程序上的结构,而嵌套表是一种对象的类型,尽管他们都是PL/SQL表类型,但是在结构上有明显
的区别。
注:可以通过IS NULL来判断嵌套表是否已经被构造来使用嵌套表。
嵌套表的初始化与访问。
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);8
END;
emp_name_info表在定义时使用了构造函数进行初始化,因为在构造函数中指定了两个元素,
根据嵌套表下标从1开始的原则,可以通过emp_name_info(1)和emp_name_info(2)访问这
两个元素。
deptno_info 首先通过IS NULL判断该嵌套表是否使用构造函数进行过初始化,然后调用构造
函数初始化deptno_info嵌套表,在这里并没有在构造函数中添加任何元素,这表示嵌套表中
没有任何元素,意思是指在嵌套表中没有预留任何内存空间来放置元素。如果为嵌套表中的
元素赋初值,Oracle会触发异常。
未分配元素并不表示元素已存在,为了向deptno_info嵌套表中插入元素,必须首先使用
嵌套表的EXTEND方法扩充指定的元素个数,然后才能通过下标进行访问。
而索引表仅仅是内存表。而且,嵌套表必须使用其构造方法对嵌套表进行初始化。嵌套表
没有INDEX BY子句,这个与索引表直接最明显的区别,因为嵌套表必须用有序的关键字创建,
而且关键字不能为负数。
索引表
7369 NULL 7521 7566 7902 7788
1 2 -5 120 KEY1 10
下标可以为正数,负数或字符串
嵌套表
7369 NULL 7521 7566 7902 7788
1 2 3 4 5 6
下标必须为有序类型,不可以为负数,只能从1开始
高级语言数组
7369 NULL 7521 7566 7902 7788
1 2 3 4 5 6
下标只能为从0或1开始的连续数字
嵌套表的定义语法:
TYPE type_naem AS TABLE OF element_type[NOT NULL]
语法中各个部分的含义如下所示:
element_name:不超过30字符。
element_type:用于指定嵌套表元素的数据类型,可以是用户定义的对象类型,也可以是
使用%TYPE的表达好似,但是不可以是BOOLEAN,NCHAR,NCLOB,NVARCHAR2或REF CURSOR.
当使用嵌套表元素时,必须首先使用构造语法初始化嵌套表。
8.2.5
操纵嵌套表
由于在嵌套表使用之前必须进行构造,为构造的嵌套表被自动地赋初始值NULL,这与索引表不同,索引表
只是一种程序上的结构,而嵌套表是一种对象的类型,尽管他们都是PL/SQL表类型,但是在结构上有明显
的区别。
注:可以通过IS NULL来判断嵌套表是否已经被构造来使用嵌套表。
嵌套表的初始化与访问。
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);8
END;
emp_name_info表在定义时使用了构造函数进行初始化,因为在构造函数中指定了两个元素,
根据嵌套表下标从1开始的原则,可以通过emp_name_info(1)和emp_name_info(2)访问这
两个元素。
deptno_info 首先通过IS NULL判断该嵌套表是否使用构造函数进行过初始化,然后调用构造
函数初始化deptno_info嵌套表,在这里并没有在构造函数中添加任何元素,这表示嵌套表中
没有任何元素,意思是指在嵌套表中没有预留任何内存空间来放置元素。如果为嵌套表中的
元素赋初值,Oracle会触发异常。
未分配元素并不表示元素已存在,为了向deptno_info嵌套表中插入元素,必须首先使用
嵌套表的EXTEND方法扩充指定的元素个数,然后才能通过下标进行访问。