• Oracle数据库中的集合(联合数组,嵌套表和可变数组)


    目录

    1.集合

    1.联合数组

    (1)格式定义

    2.嵌套表

    (1)格式定义

    (2)初始化

    (3)元素有序性

    4.可变数组

    5.集合的属性和方法

    (1)COUNT属性

    (2)DELETE方法

    ①DELETE方法形式

    (3)EXTEND方法

    ② EXTEND具体形式

    (4)EXISTS方法

    (5)LIMIT属性

    (6)FIRST/LAST属性

    (7)NEXT/PRIOR方法

    (8)TRIM方法

    ①TRIM形式


    Oracle学习的相关知识点(汇总)

    1.集合

    PL/SQL中使用如C/C++等高级语言一样的数组形式,用来管理多行数据的结构体。

    集合就是一个列表,如python中的列表一样,这些存在列表中的元素可以是有序的,也可以是无序的。其中有序的索引是唯一性的数字下标,而无序列表的索引是唯一性的标识符,这些标识符可以是数字,哈希值以及字符串名(比如映射)。

    以下主要讲述三种类型的集合:联合数组,嵌套表和可变数组。 

    1.联合数组

     这里的联合数组就如同C/C++中的二维数组。

    (1)格式定义

    TYPE <联合数组名>

            IS

            TABLE OF <数据类型> INDEX BY BINARY_INTEGER;

    如果要访问已经赋值了的联合数组:

    <联合数组名>[index];

    其中index表示第几个元素(下标索引),其数据类型属于BINARY_INTEGER; 

    例子:

    1. --使用联合数组访问数据
    2. SET SERVEROUTPUT ON;
    3. DECLARE
    4. TYPE V_NAME
    5. IS
    6. TABLE OF XSB.sid%TYPE
    7. INDEX BY BINARY_INTEGER;
    8. --声明变量
    9. vx_name V_NAME;
    10. cnt number:=0;
    11. BEGIN
    12. select count(*) into cnt
    13. from xsb;
    14. DBMS_OUTPUT.PUT_LINE('学生记录条数: '||to_char(cnt));
    15. --首先给联合数组赋值
    16. for i IN 1..cnt loop
    17. vx_name(i):=to_char(i);
    18. end loop;
    19. --输出联合数组中的值
    20. for i IN 1..cnt loop
    21. DBMS_OUTPUT.PUT_LINE(vx_name(i));
    22. end loop;
    23. END;

      

    注意:联合数组中的元素不是按特定顺序排列的,这与后面的嵌套要相区别。

    2.嵌套表

    (1)格式定义

    TYPE <联合数组名>

            IS

            TABLE OF <数据类型> [NOT NULL];

    (2)初始化

    嵌套表初始化:在声明了嵌套表变量类型时,如果嵌套表中没有任何的元素,那么嵌套表会自动的初始化为NULL,并且是只读的,如果还想要向嵌套表中加入元素,那么会报错(在声明变量的时候可以向嵌套表中加入任意元素,但是元素的类型必须符合声明的类型)。

    联合数组的初始化和嵌套表的初始化完全不同:联合表在声明的时候如果没有给联合数组赋值,那么联合数组就是一个空表,但是后面在对联合数组想要添加元素的时候,可以任意的添加符合类型的元素。

    例子:声明一个嵌套表并向其中加入元素“dream”,“belief”。


    SET SERVEROUTPUT ON;
    DECLARE
        TYPE Node
        IS 
        TABLE OF varchar2(20);
        --声明一个嵌套表
        v_value Node:=Node('dream','belief');
    BEGIN 
        FOR i IN 1..2 LOOP
            DBMS_OUTPUT.PUT_LINE('String: '||to_char(v_value(i)));
        END LOOP;
    END;

    (3)元素有序性

     嵌套表在结构上是有序的,而联合数组则是无序的,如果给一个嵌套表赋值的话,那么表元素的index将会从1开始依次递增。

    例子1:有序输出一个序列:1,3,5,6,7,8,9 (嵌套表实现)

    SET SERVEROUTPUT ON;
    DECLARE
        TYPE Node
        IS 
        TABLE OF number;
        --声明一个嵌套表
        v_value Node:=Node(1,3,5,6,7,8,9);
    BEGIN 
        FOR i IN 1..7 LOOP
            DBMS_OUTPUT.PUT_LINE('index('||to_char(i)||')='||to_char(v_value(i)));
        END LOOP;
    END;

     

    例子2:输出一个序列:1,3,5,6,7,8,9 (联合数组实现)

    1. SET SERVEROUTPUT ON;
    2. DECLARE
    3. TYPE UNITE_Node
    4. IS
    5. TABLE OF NUMBER INDEX BY BINARY_INTEGER;
    6. --声明一个嵌套表
    7. v_value UNITE_Node;
    8. BEGIN
    9. v_value(1):=1;
    10. v_value(2):=3;
    11. v_value(3):=5;
    12. v_value(4):=6;
    13. v_value(5):=7;
    14. v_value(6):=8;
    15. v_value(7):=9;
    16. FOR i IN 1..7 LOOP
    17. DBMS_OUTPUT.PUT_LINE('index('||to_char(i)||')='||to_char(v_value(i)));
    18. END LOOP;
    19. END;

     

    4.可变数组

    TYPE <联合数组名>

            IS

            {VARRAY | VARYING ARRAY}(<元素个数最大值>)

            OF <数据类型> [NOT NULL];

    例子:定义一个数组大小为8的可变数组。

    SET SERVEROUTPUT ON;
    DECLARE
        TYPE Node
        IS VARRAY(8) OF number;
        --声明一个嵌套表
        v_value Node:=Node(1,3,5,6,7,8,9);
    BEGIN 
        FOR i IN 1..7 LOOP
            DBMS_OUTPUT.PUT_LINE('index('||to_char(i)||')='||to_char(v_value(i)));
        END LOOP;
    END;

     

    5.集合的属性和方法

    (1)COUNT属性

    COUNT用来返回集合中的数组元素个数(三种集合类型都适用)。

    例子1:

    1. SET SERVEROUTPUT ON;
    2. DECLARE
    3. --定义可变数组
    4. TYPE VarNode
    5. IS
    6. VARRAY(8) OF number;
    7. --定义联合数组
    8. TYPE UNITNode
    9. IS
    10. TABLE OF number INDEX BY BINARY_INTEGER;
    11. --定义嵌套表
    12. TYPE NestNode
    13. IS
    14. TABLE OF number;
    15. --声明一个嵌套表
    16. N_value NestNode:=NestNode(1,3,5,6,7,8,9);
    17. --声明一个联合数组
    18. Unit_value UNITNode;
    19. --声明一个可变数组
    20. Var_value VarNode:=VarNode(1,3,5,6,7,8,9);
    21. BEGIN
    22. for i IN 1..7 loop
    23. Unit_value(i):=to_char(i);
    24. end loop;
    25. DBMS_OUTPUT.PUT_LINE('嵌套数组大小: '||to_char(N_value.count));
    26. DBMS_OUTPUT.PUT_LINE('可变数组大小: '||to_char(Var_value.count));
    27. DBMS_OUTPUT.PUT_LINE('联合数组大小: '||to_char(Unit_value.count));
    28. END;

    (2)DELETE方法

     DELETE方法用于删除集合中一个或者多个元素。

    注意:DELETE执行删除操作的大小是固定的,所以对于可变的数组是没有DELETE方法。

    ①DELETE方法形式

    (1)DELETE:不带参数的DELETE方法,也就是删除整个的集合。

    (2)DELETE(x):将集合表中第x个位置的元素删除;

    (3)DELETE(x,y):将集合表中从第x个位置到第y个位置之间的所有元素删除掉。

    1. SET SERVEROUTPUT ON;
    2. DECLARE
    3. --定义可变数组
    4. TYPE VarNode
    5. IS
    6. VARRAY(8) OF number;
    7. --定义联合数组
    8. TYPE UNITNode
    9. IS
    10. TABLE OF number INDEX BY BINARY_INTEGER;
    11. --定义嵌套表
    12. TYPE NestNode
    13. IS
    14. TABLE OF number;
    15. --声明一个嵌套表
    16. N_value NestNode:=NestNode(1,3,5,6,7,8,9);
    17. --声明一个联合数组
    18. Unit_value UNITNode;
    19. --声明一个可变数组
    20. Var_value VarNode:=VarNode(1,3,5,6,7,8,9);
    21. BEGIN
    22. for i IN 1..7 loop
    23. Unit_value(i):=to_char(i);
    24. end loop;
    25. DBMS_OUTPUT.PUT_LINE('嵌套数组大小: '||to_char(N_value.count));
    26. --删除第2个位置的u元素
    27. N_value.delete(2);
    28. DBMS_OUTPUT.PUT_LINE('删除元素之后的嵌套数组的大小: '||to_char(N_value.count));
    29. DBMS_OUTPUT.PUT_LINE('可变数组大小: '||to_char(Var_value.count));
    30. DBMS_OUTPUT.PUT_LINE('联合数组大小: '||to_char(Unit_value.count));
    31. Unit_value.delete(2);
    32. DBMS_OUTPUT.PUT_LINE('删除元素之后的联合数组的大小: '||to_char(Unit_value.count));
    33. END;

    (3)EXTEND方法

     EXTEND方法用来将元素添加到集合的末端。

    提示:由于联合数组元素的随意性,因此EXTEDN方法只适用于可变数组和嵌套方法。 

    ② EXTEND具体形式

    (1)EXTEND:不带参数的EXTEND是将一个NULL元素添加到集合的末端。

    (2)EXTEND(x):将x个NULL元素添加到末端。

    (3)EXTEND(x,y):将x个位于y的元素添加到集合的末端。

    例子:

    1. SET SERVEROUTPUT ON;
    2. DECLARE
    3. --定义可变数组
    4. TYPE VarNode
    5. IS
    6. VARRAY(12) OF number;
    7. --声明一个可变数组
    8. Var_value VarNode:=VarNode(1,3,5,6,7,8,9);
    9. BEGIN
    10. DBMS_OUTPUT.PUT_LINE('可变数组大小: '||to_char(Var_value.count));
    11. Var_value.EXTEND(2,2);
    12. DBMS_OUTPUT.PUT_LINE('大小元素之后的可变数组的大小: '||to_char(Var_value.count));
    13. FOR i IN 1..Var_value.count LOOP
    14. DBMS_OUTPUT.PUT_LINE(to_char(Var_value(i)));
    15. END LOOP;
    16. END;

    (4)EXISTS方法

     EXISTS方法用来判断集合中的元素是否存在:EXISTS(x).

    提示:如果位于x的元素是存在的,那么结果返回TRUE;如果x的值大于了集合的范围,则返回FALSE。

    (5)LIMIT属性

    LIMIT属性用于返回集合中的最大元素的个数。

    提示:由于嵌套表没有元素个数的上限,所以嵌套表使用该属性只会返回NULL。 

    例子:


    SET SERVEROUTPUT ON;
    DECLARE
        --定义可变数组
        TYPE VarNode
        IS 
        VARRAY(12) OF number;
        --声明一个可变数组
        Var_value VarNode:=VarNode(1,3,5,6,7,8,9);
    BEGIN 
        DBMS_OUTPUT.PUT_LINE('可变数组大小: '||to_char(Var_value.count));
        DBMS_OUTPUT.PUT_LINE('可变数组中最大值元素的个数: '||to_char(Var_value.limit));
    END;

     

    (6)FIRST/LAST属性

    FIRST属性用于返回集合中第一个元素的位置;

    LAST属性用于返回集合中最后一个元素的位置。

    (7)NEXT/PRIOR方法

    NEXT(x):返回位置为x处的元素后面的那个元素;

    PRIOR(x):返回位置为x处的元素前面的那个元素。

    1. SET SERVEROUTPUT ON;
    2. DECLARE
    3. --定义可变数组
    4. TYPE VarNode
    5. IS
    6. VARRAY(12) OF number;
    7. --声明一个可变数组
    8. Var_value VarNode:=VarNode(1,3,5,6,7,8,9);
    9. v_num number:=0;
    10. BEGIN
    11. DBMS_OUTPUT.PUT_LINE('可变数组大小: '||to_char(Var_value.count));
    12. DBMS_OUTPUT.PUT_LINE('可变数组中最大值元素的个数: '||to_char(Var_value.limit));
    13. v_num:=Var_value.FIRST;
    14. WHILE v_num<=Var_value.LAST LOOP
    15. DBMS_OUTPUT.PUT_LINT(to_char(Var_value.NEXT(v_num)));
    16. v_num:=v_num+1;
    17. IF v_num=3 THEN
    18. EXIT;
    19. END IF;
    20. END LOOP;
    21. END;

    (8)TRIM方法

    用来删除集合末端的元素。

    ①TRIM形式

    (1)TRIM:从集合末端删除一个元素;

    (2)TRIM(x):从集合末端删除x个元素,当然x的大小小于集合的范围。

    提示:TRIM只适用与嵌套表和可变数组。

  • 相关阅读:
    Python 自动化教程(5) : 自动生成Word文件
    解决问题:There is no tracking information for the current branch
    【C++ Primer Plus】第1章 预备知识
    OpenGL 色彩替换
    十个最为戳心测试/开程序员笑话,念茫茫人海,该如何寻觅?
    LeetCode-50-Pow(x, n)
    C++ ,VCPKG那些事
    workflow一次完成多个模型评价和比较
    Android -- 对话框 Dialog: 确定取消,单选多选,进度显示, 常用控件示例:单选多选框,下拉列表,进度条,自动完成文本框, 菜单显示
    时间序列与 Statsmodels:预测所需的基本概念(1)
  • 原文地址:https://blog.csdn.net/Keep_Trying_Go/article/details/127040923