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

发布于:2022-12-07 ⋅ 阅读:(764) ⋅ 点赞:(0)

目录

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; 

例子:

--使用联合数组访问数据
SET SERVEROUTPUT ON;
DECLARE
    TYPE V_NAME
    IS 
    TABLE OF XSB.sid%TYPE
        INDEX BY BINARY_INTEGER;
    --声明变量
    vx_name V_NAME;
    cnt number:=0;
BEGIN
    select count(*) into cnt 
        from xsb;
    DBMS_OUTPUT.PUT_LINE('学生记录条数: '||to_char(cnt));
    --首先给联合数组赋值
    for i IN 1..cnt loop
        vx_name(i):=to_char(i);
    end loop;
    --输出联合数组中的值
    for i IN 1..cnt loop
        DBMS_OUTPUT.PUT_LINE(vx_name(i));
    end loop;
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 (联合数组实现)

SET SERVEROUTPUT ON;
DECLARE
    TYPE UNITE_Node
    IS 
    TABLE OF NUMBER INDEX BY BINARY_INTEGER;
    --声明一个嵌套表
    v_value UNITE_Node;
BEGIN 
    v_value(1):=1;
    v_value(2):=3;
    v_value(3):=5;
    v_value(4):=6;
    v_value(5):=7;
    v_value(6):=8;
    v_value(7):=9;
    FOR i IN 1..7 LOOP
        DBMS_OUTPUT.PUT_LINE('index('||to_char(i)||')='||to_char(v_value(i)));
    END LOOP;
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:

SET SERVEROUTPUT ON;
DECLARE
    --定义可变数组
    TYPE VarNode
    IS 
    VARRAY(8) OF number;
    --定义联合数组
    TYPE UNITNode
    IS 
    TABLE OF number INDEX BY BINARY_INTEGER;
    --定义嵌套表
    TYPE NestNode
    IS
    TABLE OF number;
    --声明一个嵌套表
    N_value NestNode:=NestNode(1,3,5,6,7,8,9);
    --声明一个联合数组
    Unit_value UNITNode;
    --声明一个可变数组
    Var_value VarNode:=VarNode(1,3,5,6,7,8,9);
BEGIN 
    for i IN 1..7 loop
        Unit_value(i):=to_char(i);
    end loop;
    DBMS_OUTPUT.PUT_LINE('嵌套数组大小: '||to_char(N_value.count));
    DBMS_OUTPUT.PUT_LINE('可变数组大小: '||to_char(Var_value.count));
    DBMS_OUTPUT.PUT_LINE('联合数组大小: '||to_char(Unit_value.count));
END;

(2)DELETE方法

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

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

①DELETE方法形式

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

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

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

SET SERVEROUTPUT ON;
DECLARE
    --定义可变数组
    TYPE VarNode
    IS 
    VARRAY(8) OF number;
    --定义联合数组
    TYPE UNITNode
    IS 
    TABLE OF number INDEX BY BINARY_INTEGER;
    --定义嵌套表
    TYPE NestNode
    IS
    TABLE OF number;
    --声明一个嵌套表
    N_value NestNode:=NestNode(1,3,5,6,7,8,9);
    --声明一个联合数组
    Unit_value UNITNode;
    --声明一个可变数组
    Var_value VarNode:=VarNode(1,3,5,6,7,8,9);
BEGIN 
    for i IN 1..7 loop
        Unit_value(i):=to_char(i);
    end loop;
    DBMS_OUTPUT.PUT_LINE('嵌套数组大小: '||to_char(N_value.count));
    --删除第2个位置的u元素
    N_value.delete(2);
    DBMS_OUTPUT.PUT_LINE('删除元素之后的嵌套数组的大小: '||to_char(N_value.count));
    DBMS_OUTPUT.PUT_LINE('可变数组大小: '||to_char(Var_value.count));
    
    DBMS_OUTPUT.PUT_LINE('联合数组大小: '||to_char(Unit_value.count));
    Unit_value.delete(2);
    DBMS_OUTPUT.PUT_LINE('删除元素之后的联合数组的大小: '||to_char(Unit_value.count));
END;

(3)EXTEND方法

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

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

② EXTEND具体形式

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

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

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

例子:


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));
    Var_value.EXTEND(2,2);
    DBMS_OUTPUT.PUT_LINE('大小元素之后的可变数组的大小: '||to_char(Var_value.count));
    FOR i IN 1..Var_value.count LOOP
        DBMS_OUTPUT.PUT_LINE(to_char(Var_value(i)));
    END LOOP;
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处的元素前面的那个元素。

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

(8)TRIM方法

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

①TRIM形式

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

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

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

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到