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

单行单列     变量    
单行多列     记录    
多行单列     集合    
多行多列     记录+集合

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

 

posted @ 2020-04-16 11:20  kakaisgood  阅读(655)  评论(0编辑  收藏  举报