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