目录
PL/SQL中使用如C/C++等高级语言一样的数组形式,用来管理多行数据的结构体。
集合就是一个列表,如python中的列表一样,这些存在列表中的元素可以是有序的,也可以是无序的。其中有序的索引是唯一性的数字下标,而无序列表的索引是唯一性的标识符,这些标识符可以是数字,哈希值以及字符串名(比如映射)。
以下主要讲述三种类型的集合:联合数组,嵌套表和可变数组。
这里的联合数组就如同C/C++中的二维数组。
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;
注意:联合数组中的元素不是按特定顺序排列的,这与后面的嵌套要相区别。
TYPE <联合数组名>
IS
TABLE OF <数据类型> [NOT NULL];
嵌套表初始化:在声明了嵌套表变量类型时,如果嵌套表中没有任何的元素,那么嵌套表会自动的初始化为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;
嵌套表在结构上是有序的,而联合数组则是无序的,如果给一个嵌套表赋值的话,那么表元素的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;
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;
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;
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;
EXTEND方法用来将元素添加到集合的末端。
提示:由于联合数组元素的随意性,因此EXTEDN方法只适用于可变数组和嵌套方法。
(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;
EXISTS方法用来判断集合中的元素是否存在:EXISTS(x).
提示:如果位于x的元素是存在的,那么结果返回TRUE;如果x的值大于了集合的范围,则返回FALSE。
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;
FIRST属性用于返回集合中第一个元素的位置;
LAST属性用于返回集合中最后一个元素的位置。
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;
用来删除集合末端的元素。
(1)TRIM:从集合末端删除一个元素;
(2)TRIM(x):从集合末端删除x个元素,当然x的大小小于集合的范围。
提示:TRIM只适用与嵌套表和可变数组。