• 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;
    /
  • 相关阅读:
    CTO这点事(技术,业务,管理,情商,周期,趋势)转
    Unit Test相关问题汇总
    优秀的命令行文件传输程序(转)
    ZOJ3329之经典概率DP
    Sql Server 2005 开发版亲測可用下载地址
    Hadoop与HBase中遇到的问题
    Struts2自己定义拦截器实例—登陆权限验证
    手游Apk破解疯狂,爱加密apk加固保护开发人员
    HighCharts 具体使用及API文档说明
    Linux(SLES)挂载NTFS移动硬盘实践
  • 原文地址:https://www.cnblogs.com/kakaisgood/p/12711455.html
Copyright © 2020-2023  润新知