一、EXISTS函数
1、检测集合中的元素是否存在
DECLARE
TYPE DNameList IS TABLE OF VARCHAR2(14);
nameList DNameList ;
BEGIN
nameList:=DNameList(NULL,'CORESUN','CORESUN');
IF nameList.EXISTS(1) THEN
DBMS_OUTPUT.PUT_LINE('存在此元素');
ELSE
DBMS_OUTPUT.PUT_LINE('不存在此元素');
END IF;
END;
打印的结果当然是:存在此元素。虽然此元素的值是NULL,但是此元素是存在的。可以将1换成4,重新运行程序,将打印出:不存在此元素。对于可变数组来说使用方法与嵌套表相同。如果索引表使用该方法,可以传递字符串作为参数,如:
DECLARE
TYPE CoutryList IS TABLE OF NUMBER
NOT NULL INDEX BY VARCHAR2(20);
myList CoutryList;
BEGIN
myList('China'):=1;
myList('Japan'):=2;
myList('USA'):=3;
IF myList.EXISTS('China') THEN --注意键字符串区分大小写
DBMS_OUTPUT.PUT_LINE('存在此元素');
ELSE
DBMS_OUTPUT.PUT_LINE('不存在此元素');
END IF;
END;
2、当没有初始化的嵌套表变量或可变数组变量调用EXISTS函数时,不会抛出异常,而是返回FALSE,如:
DECLARE
TYPE DNameList IS TABLE OF VARCHAR2(14);
nameList DNameList ;
BEGIN
IF nameList.EXISTS(1) THEN
DBMS_OUTPUT.PUT_LINE('存在此元素');
ELSE
DBMS_OUTPUT.PUT_LINE('不存在此元素');
END IF;
END;
打印的结果是:不存在此元素。但是要注意,此时嵌套表变量nameList根本没有被初始化。后面介绍的几个集合方法,如果嵌套表变量或是可变数组变量没有被初始化,调用时将会抛出COLLECTION_IS_NULL异常。
二、COUNT函数
该函数能够返回集合中包含元素的个数。
1、检测索引表中元素的个数
DECLARE
TYPE CoutryList IS TABLE OF NUMBER
NOT NULL INDEX BY VARCHAR2(20);
myList CoutryList;
BEGIN
myList('China'):=1;
myList('Japan'):=2;
myList('USA'):=3;
DBMS_OUTPUT.PUT_LINE('此索引表中元素的个数为'||myList.COUNT);
END;
打印的结果:此索引表中元素的个数为3
2、检测可变数组元素的个数
DECLARE
TYPE DNameList IS VARRAY(10) OF VARCHAR2(14);
nameList DNameList:=DNameList('综合部','市场部','社教部',NULL);
BEGIN
DBMS_OUTPUT.PUT_LINE('此可变数组的元素个数为'||nameList.COUNT);
END;
打印结果:此变长数组的元素个数为4。注意第四个元素的值为NULL,但仍然是一个元素。虽然定义变长数组时指定的长度是10,但是COUNT函数返回的是实际的元素个数。
3、检测嵌套表元素的个数
DECLARE
TYPE DNameList IS TABLE OF VARCHAR2(14);
nameList DNameList ;
BEGIN
nameList:=DNameList(NULL,'CORESUN','CORESUN');
DBMS_OUTPUT.PUT_LINE('嵌套表元素个数为'||nameList.COUNT);
nameList.delete(2);
DBMS_OUTPUT.PUT_LINE('删除第二个元素后嵌套表元素个数为'||nameList.COUNT);
nameList(2):='CORESUN';
DBMS_OUTPUT.PUT_LINE('嵌套表元素个数为'||nameList.COUNT);
END;
打印的结果为:
嵌套表元素个数为3
删除第二个元素后嵌套表元素个数为2
嵌套表元素个数为3
注意:COUNT函数会忽略掉被DELETE方法删除的元素。
三、LIMIT函数
对于下标是字符串的索引表调用LIMIT函数时会报错,对于下标是整数的索引表调用LIMIT函数时会返回NULL。对于嵌套表来说,调用LIMIT函数时返回NULL值。对于可变数组来说返回声明时指定的值。如:
DECLARE
TYPE DNameTableList IS TABLE OF VARCHAR2(14);
nameTableList DNameTableList:=DNameTableList('综合部','市场部','社教部',NULL);
TYPE DNameArrayList IS VARRAY(10) OF VARCHAR2(14);
nameArrayList DNameArrayList:=DNameArrayList('综合部','市场部','社教部',NULL);
TYPE CoutryList IS TABLE OF NUMBER
NOT NULL INDEX BY BINARY_INTEGER;
myList CoutryList;
BEGIN
myList(1):=1;
myList(2):=2;
myList(3):=3;
DBMS_OUTPUT.PUT_LINE('索引表的LIMIT函数返回值'||myList.LIMIT);
DBMS_OUTPUT.PUT_LINE('嵌套表的LIMIT函数返回值'||nameTableList.LIMIT);
DBMS_OUTPUT.PUT_LINE('可变数组的LIMIT函数返回值'||nameArrayList.LIMIT);
END;
四、FIRST和LAST函数
这两个函数用于返回集合中第一个和最后一个元素的下标值,如果索引表使用的字符串下标,会按照字符串进行排序后返回。如果集合的长度为0,FIRST函数和LAST函数返回值都是NULL。
1、返回下标是字符串的索引表的第一个和最后一个下标
DECLARE
TYPE CoutryList IS TABLE OF NUMBER
NOT NULL INDEX BY VARCHAR2(10);
myList CoutryList;
BEGIN
myList('China'):=1;
myList('Japan'):=2;
myList('USA'):=3;
DBMS_OUTPUT.PUT_LINE('索引表的FIRST函数返回值:'||myList.FIRST);
DBMS_OUTPUT.PUT_LINE('索引表的LAST函数返回值:'||myList.LAST);
END;
结果:
索引表的FIRST函数返回值:China
嵌套表的LAST函数返回值:USA
2、返回下标是整数的索引表的第一个和最后一个下标
DECLARE
TYPE CoutryList IS TABLE OF NUMBER
NOT NULL INDEX BY BINARY_INTEGER;
myList CoutryList;
BEGIN
myList(-100):=-100;
myList(0):=0;
myList(20):=20;
DBMS_OUTPUT.PUT_LINE('索引表的FIRST函数返回值:'||myList.FIRST);
DBMS_OUTPUT.PUT_LINE('索引表的LAST函数返回值:'||myList.LAST);
END;
结果:
索引表的FIRST函数返回值:-100
嵌套表的LAST函数返回值:20
3、返回可变数组的第一个和最后一个下标
对于可变数组来说,由于不允许删除元素,所以FIRST函数值总是等于1,而LAST函数值总是等于COUNT函数值。
DECLARE
TYPE DNameArrayList IS VARRAY(10) OF VARCHAR2(14);
nameArrayList DNameArrayList:=DNameArrayList('综合部','市场部','社教部',NULL);
BEGIN
DBMS_OUTPUT.PUT_LINE('可变数组的FIRST函数返回值:'||nameArrayList.FIRST);
DBMS_OUTPUT.PUT_LINE('可变数组的LAST函数返回值:'||nameArrayList.LAST);
END;
结果:
可变数组的FIRST函数返回值:1
可变数组的LAST函数返回值:4
4、返回嵌套表的第一个和最后一个下标
嵌套表允许删除元素,所以嵌套表的的FIRST函数值总是大于或等于1,而LAST函数值总是大于或等于COUNT函数值。
DECLARE
TYPE DNameTableList IS TABLE OF VARCHAR2(14);
nameTableList DNameTableList:=DNameTableList('综合部','市场部','社教部',NULL);
BEGIN
nameTableList.delete(1);
nameTableList.delete(4);
DBMS_OUTPUT.PUT_LINE('嵌套表的FIRST函数返回值:'||nameTableList.FIRST);
DBMS_OUTPUT.PUT_LINE('嵌套表的LAST函数返回值:'||nameTableList.LAST);
END;
结果:
嵌套表的FIRST函数返回值:2
嵌套表的LAST函数返回值:3
五、PRIOR函数和NEXT函数
PRIOR(n)返回n的上一个索引值,如果n没有上一个索引值,则返回NULL。NEXT(n)返回n的下一个索引值,如果n没有下一个索引值,则返回NULL。使用PRIOR函数或NEXT函数遍历集合会更加有效,因为对于索引表来说下标可能是不连续的,对于嵌套表来说可能会插入或删除元素。以下代码通过NEXT函数遍历了嵌套表的所用值:
DECLARE
TYPE DNameTableList IS TABLE OF VARCHAR2(14);
nameTableList DNameTableList:=DNameTableList('综合部','市场部','社教部','财务部');
i INTEGER;
BEGIN
i:=nameTableList.FIRST();
WHILE i IS NOT NULL LOOP
DBMS_OUTPUT.PUT_LINE('索引为'||i||'的值为:'||nameTableList(i));
i:=nameTableList.NEXT(i);
END LOOP;
END;
结果为:
索引为1的值为:综合部
索引为2的值为:市场部
索引为3的值为:社教部
索引为4的值为:财务部
六、EXTEND过程
该过程用于扩展嵌套表和可变数组的长度,该过程不能用于索引表。该过程有三种重载形式:
EXTEND 在集合末尾添加一个NULL元素
EXTEND(n) 在集合末尾添加n个NULL元素
EXTEND(n,i)把第i个元素值拷贝n份添加到集合末尾
注意:如果在声明嵌套表或可变数组时指定了NOT NULL,那么该过程的前两种形式就不能在使用了。
使用EXTEND过程时,嵌套表情况会稍稍复杂一点,因为嵌套表可能会删除元素。以下示例演示了嵌套表元素在内存中的分布结构:
DECLARE
TYPE DNameTableList IS TABLE OF VARCHAR2(14);
nameTableList DNameTableList:=DNameTableList(NULL,'综合部','市场部','社教部');
内存结构如下:
调用nameTableList.EXTEND后结构如下:
此时nameTableList.COUNT为5,nameTableList.LAST值为5
继续如下的调用,nameTableList.EXTEND(2,3),结构如下图所示:
七、TRIM过程
TRIM过程用于删除嵌套表和可变数组末尾的元素,该过程不能用于索引表。它有以下两种重载的形式:
TRIM 从集合末尾删除一个元素
TRIM(n) 从集合末尾删除n个元素
以下示例演示了嵌套表调用TRIM过程删除元素后内存结构的变化:
DECLARE
TYPE DNameTableList IS TABLE OF VARCHAR2(14);
nameTableList DNameTableList:=DNameTableList(NULL,'综合部','市场部','社教部');
内存结构如下图所示:
当调用了nameTableList.TRIM后,结构如下图:
此时nameTableList.COUNT为3,nameTableList.LAST值为3,如果调用nameTableList(4):='CORESUN' 则会抛出SUBSCRIPT_BEYOND_COUNT异常。
八、DELETE过程
DELETE过程用于删除嵌套表和索引表的元素,该过程不能用于可变数组。它有以下三种重载的形式:
DELETE 删除集合中的所有元素,可用于可变数组,删除后集合变量为NULL。
DELETE(n) 删除索引为n的元素,不可用于可变数组。
DELETE(m,n) 删除索引从m到n的所有元素,不可用于可变数组。
以下示例演示从嵌套表中使用DELETE删除元素及元素在内存中的结构:
DECLARE
TYPE DNameTableList IS TABLE OF VARCHAR2(14);
nameTableList DNameTableList:=DNameTableList(NULL,'综合部','市场部','社教部');
调用nameTableList.DELETE(4)后,内存结构如下:
嵌套表占用的内存是动态的,删除时会被自动释放,但PL/SQL会在嵌套表中使用占位符标识该位置。此时nameTableList.COUNT为3,nameTableList.LAST值为3,如果调用nameTableList(4):='CORESUN' 则不会抛出异常,内存结构如下:
此外注意以下几种形式的调用:
nameTableList.DELETE(4,4) 删除索引为4的元素
nameTableList.DELETE(5,2) 什么都不做
nameTableList.DELETE('China') 删除索引为'China'的元素
nameTableList.DELETE('China','Japan') 删除从索引China至Japan之间的元素