当前位置:   article > 正文

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

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只适用与嵌套表和可变数组。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/766243
推荐阅读
相关标签
  

闽ICP备14008679号