单行单列    

变量    

单行多列    

记录    

多行单列    

集合    

多行多列    

记录+集合

 ​

定义:

       集合是相同类型元素的组合。数据库中相当于"多行单列", 类似于数组, 使用唯一的下标来标识其中的每个元素

 

PL/SQL:集合类型 (定义,分类,使用场景,集合方法)_多列

 

 

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;
/