复合数据类型
--------------------------------------------------
-----此处偶做了index_by表的试验:
测试1
declare
type t_product_id is table of number index by binary_integer;
type t_serial_no is table of varchar(300) index by binary_integer;
type t_buy_date is table of date index by binary_integer;
gzff_id t_product_id;
dw_name t_serial_no;
year_month t_buy_date;
----------------------------
cursor cur_sfc_tbl_product_reg is
select a.GZFF_ID GZFF_ID, a.DW_NAME DW_NAME, a.YEAR_MONTH YEAR_MONTH
from RM.HRM_COMP_GZFF a;
i number default 1;
begin
for onrecord in cur_sfc_tbl_product_reg loop
GZFF_ID(i) := onrecord.GZFF_ID;
DW_NAME(i) := onrecord.DW_NAME;
YEAR_MONTH(i) := onrecord.YEAR_MONTH;
dbms_output.put_line(to_char(GZFF_ID(i)) || DW_NAME(i) ||
to_char(YEAR_MONTH(i)));
i := i + 1;
end loop;
end;
--------------------------------------------------
测试2
declare
type ltype_id is table of number(38) index by binary_integer;
ll_id ltype_id;
cursor cur_qcs_cor_ntf_new is
select * from qm.qcs_cor_ntf_new ;
i number :=1;
begin
for on_record in cur_qcs_cor_ntf_new
loop
ll_id(i) := on_record.id;
dbms_output.put_line('第'||i||' 个,值为: '||ll_id(i));
i:=i+1;
end loop;
end ;
------------------------------------------------------
--上面为自己做的例子,下面为参考说明
------------------------------------------------------
集合的类型
PL/SQL有三种类型的集合
. Index_by表
. 嵌套表
. VARRAY
这三种类型的集合之间由许多差异,包括数据绑定、稀疏性(sparsity)、数据库中的存储能力都不相同。绑定涉及到集合中元素数量的限制,VARRAY集合中的元素的数量是有限,Index_by和嵌套表则是没有限制的。稀疏性描述了集合的下标是否有间隔,Index_by表总是稀疏的,如果元素被删除了嵌套表可以是稀疏的,但VARRAY类型的集合则是紧密的,它的下标之间没有间隔。
Index_by表不能存储在数据库中,但嵌套表和VARRAY可以被存储在数据库中。
虽然这三种类型的集合有很多不同之处,但他们也由很多相似的地方:
. 都是一维的类似数组的结构
. 都有内建的方法
. 访问由点分隔
Index_by表
Index_by表集合的定义语法如下:
TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX
BY BINARY_INTERGET;
这里面重要的关键字是INDEX BY BINARY_INTERGET,没有这个关键字,那么集合将是一个嵌套表,element_type可以是任何合法的PL/SQL数据类型,包括:PLS/INTEGER、SIGNTYPE、和BOOLEAN。其他的集合类型对数据库的数据类型都有限制,但Index_by表不能存储在数据库中,所以没有这些限制。
一旦定义了index_by表,就可以向创建其他变量那样创建index_by表的变量:
DECLARE
TYPE symbol_tab_typ IS TABLE OF VARCHAR2(5) INDEX BY BINARY_INTEGER;
symbol_tab symbol_tab_typ;
BEGIN
嵌套表
嵌套表非常类似于Index_by表,创建的语法也非常相似。使用TYPE语句,只是没有INDEX BY BINARY_INTEGER子串。
TYPE type_name IS TABLE OF element_type [NOT NULL]
NOT NULL选项要求集合所有的元素都要有值,element_type可以是一个记录,但是这个记录只能使用标量数据类型字段以及只用于数据库的数据类型(不能是PLS_INTEGER,BOOLEAN或SIGNTYPE)。
嵌套表和VARRAY都能作为列存储在数据库表中,所以集合自身而不是单个的元素可以为NULL,ORACLE称这种整个集合为NULL的为"自动设置为NULL(atomically NULL)"以区别元素为NULL的情况。当集合为NULL时,即使不会产生异常,用户也不能引用集合中的元素。用户可以使用IS NULL操作符检测集合是否为NULL。
存储在一个数据库中的嵌套表并不与表中的其它数据存放在同一个数据块中,它们实际上被存放在第二个表中。正如没有order by子句select语句不能保证返回任何有顺序的数据,从数据库中取回的嵌套表也不保证元素的顺序。由于集合数据是离线存储的,对于大型集合嵌套表是一个不错的选择。
VARRAY
VARRAY或数据变量都有元素的限制。想起他集合一样VARRAY定义仍然使用TYPE语句,但关键字VARRAY或VARRYING ARRAY告诉ORACLE这是一个VARRAY集合。
TYPE type_name IS [VARRAY|VARYING ARRAY] (max_size) OF
element_type [NOT NULL]
max_size是一个整数,用于标示VARRAY集合拥有的最多元素数目。VARRAY集合的元素数量可以低于max_size,但不能超过max_size。element_type是一维元素的数据类型,如果element_type是记录,那么这个记录只能使用标量数据字段(与嵌套标相似)。NOT NULL子串表示集合中的每一个元素都必须有值。
与嵌套表相似,VARRAY能够自动为NULL,可以使用IS NULL操作符进行检测。与嵌套表不同的是,当VARRAY存储在数据库中时与表中的其他数据存放在同一个数据块中。正象列的排序保存在表的SELECT*中一样元素的顺序保存在VARRAY中。同样由于集合是在线存储的,VARRAY很适合于小型集合。
-------------------------------------------------------------------------
关于集合之间的比较
集合不能直接用于比较,要比较两个集合,可以设计一个函数,该函数返回一个标量数据类型。
IF stock_list1>stock_list2 ----非法
IF sort_collection(stock_list1)>sort_collection(stock_list2) THEN --合法
但可以比较在集合内的两个元素。