复合数据类型存储的值具有内部结构,可以将整个复合变量作为参数传递给子程序,可以单独地访问复合变量中的内部结构。内部结构可以是scalar或仍是复合类型。PL/SQL允许定义2种类型的复合数据类型:集合和记录。
在集合中,内部结构总是具有相同的数据类型,被称为元素。可以通过下标访问集合中的每个元素。
|
变量名(下标); |
为了定义一个集合变量,可以先定义一个集合类型,然后使用该集合类型定义变量;也可以使用%TYPE。
在记录中,内部结构可以有不同的数据类型,称为域。可以通过域的名称来访问记录变量中的每个域。
|
变量名.域名 |
创建记录类型变量,可以先定义一个记录类型,然后使用该记录类型定义变量;可以使用%ROWTYPE;也可以使用%TYPE
可以创建包含记录的集合,和包含集合的记录。
注意:本章的许多练习中使用到了下面的存储过程:
|
CREATE OR REPLACE PROCEDURE print (n INTEGER) IS BEGIN IF n IS NOT NULL THEN DBMS_OUTPUT.PUT_LINE(n); ELSE DBMS_OUTPUT.PUT_LINE('NULL'); END IF; END print; |
PL/SQL有3种类型的集合:associative数组,VARRAY(可变数组),嵌套表。
|
集合类型 |
元素个数 |
下标类型 |
密集/稀疏 |
未初始化 的状态 |
定义位置 |
ADT类型? |
|
关联数组 |
不确定 |
字符串/ PLS_INTEGER |
2者之一 |
Empty |
块或包 |
不 |
|
VARRAY |
确定 |
INTEGER |
始终密集 |
NULL |
块、包、方案 |
在方案中是 |
|
嵌套表 |
不确定 |
INTEGER |
开始密集,可能会变成稀疏 |
NULL |
块、包、方案 |
在方案中是 |
元素个数,如果元素个个数是确定的,则指集合中的最大元素个数;如果元素个数不确定,则最大元素个数是下标的上限值。
密集的:元素之间没有空隙,就是第1个和最后一个元素都被定义并且有值(值可以为NULL)。
EMPTY集合是存在的,但没有元素。给空集合添加元素调用EXTEND方法。
NULL集合是不存在的,把NULL集合变成存在的集合,必须要初始化它(使用它成为EMPTY集合,或给它赋一个非NULL的值),不能使用EXTEND来初始化NULL集合。
定义位置,定义在PL/SQL块中的集合类型是一个局部类型,只有在块中可访问。只有当块是一个单独的存储或包子程序时,才被存储在数据库中
定义在包规范中的集合类型是公有成员。可以在包外通过限定名来引用它。它存储在数据库中。
定义在方案中的集合类型是一个独立的存储类型。使用CREATE TYPE来创建。
非PL/SQL复合类型与PL/SQL复合类型的对照关系(problem)
|
哈希表 |
关联数组 |
|
无序表 |
关联数组 |
|
集合 |
嵌套表 |
|
袋子 |
嵌套表 |
|
数组 |
VARRAY |
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/17013648/viewspace-1107180/ ,如需转载,请注明出处,否则将追究法律责任。