单行单列 | 变量 |
单行多列 | 记录 |
多行单列 | 集合 |
多行多列 | 记录+集合 |
https://blog.csdn.net/crzzyracing/article/details/77096891
定义:
集合是相同类型元素的组合。数据库中相当于"多行单列", 类似于数组, 使用唯一的下标来标识其中的每个元素
1、索引表
TYPE type_name IS TABLE OF element_type INDEX BY index_type;
table_name type_name ;
element_type:集合中的元素的类型。如number、char, 也可以是记录
index_type :只能是整型或者字符串 pls_integer , binary_integer or char
DECLARE
type acct_num_type IS TABLE OF VARCHAR2(20) INDEX BY pls_integer;
acct_num_tab acct_num_type;
v_index pls_integer :=0;
BEGIN
FOR i IN (SELECT ACCT_NUM FROM ACCOUNT WHERE ROWNUM<5) LOOP
v_index := v_index+1;
acct_num_tab(v_index) := i.ACCT_NUM;
END LOOP;
FOR i IN acct_num_tab.FIRST .. acct_num_tab.LAST LOOP
DBMS_OUTPUT.PUT_LINE(acct_num_tab(i));
END LOOP;
END;
/
2、嵌套表
TYPE type_name IS TABLE OF element_type ;
table_name type_name ;
嵌套表和索引表区别:
嵌套表没有index by,其下标固定为整型
必须使用和其同名的构造器函数对其初始化
因为当声明嵌套表时, 其本身被设置为null. 为了引用嵌套表中的单个元素, 必须先使用同名构造器函数对他初始化
嵌套表的构造器函数与嵌套表完全同名, 可以带参也可以无参
带参: coll_name := coll_name ('firstname', 'lastname');
无参: coll_name := coll_name ();
循环遍历时,必须持续使用 .extend() 方法分配存储空间
————————————————
DECLARE type acct_num_type IS TABLE OF VARCHAR2(20); acct_num_tab acct_num_type; v_index pls_integer :=0; BEGIN acct_num_tab := acct_num_type(); FOR i IN (SELECT ACCT_NUM FROM ACCOUNT WHERE ROWNUM<5) LOOP v_index := v_index+1; acct_num_tab.extend; acct_num_tab(v_index) := i.ACCT_NUM; END LOOP; FOR i IN acct_num_tab.FIRST .. acct_num_tab.LAST LOOP DBMS_OUTPUT.PUT_LINE(acct_num_tab(i)); END LOOP; END; /
3、变长数组
定义:
有最大长度限制的嵌套表, 编码上和嵌套表完全相同
语法:
TYPE type_name IS VARRAY(最大值) OF element_type;
varray_name type_name ;
DECLARE type acct_num_type IS ARRAY(5) OF VARCHAR2(20); acct_num_tab acct_num_type; v_index pls_integer :=0; BEGIN acct_num_tab := acct_num_type(); FOR i IN (SELECT ACCT_NUM FROM ACCOUNT WHERE ROWNUM<5) LOOP v_index := v_index+1; acct_num_tab.extend; acct_num_tab(v_index) := i.ACCT_NUM; END LOOP; FOR i IN acct_num_tab.FIRST .. acct_num_tab.LAST LOOP DBMS_OUTPUT.PUT_LINE(acct_num_tab(i)); END LOOP; END; /