oracle索引表函数(集合函数)(下表为字符串的索引表举例红色)(嵌套表/索引表/可变数组举例绿色)

一、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;

四、FIRSTLAST函数
   
这两个函数用于返回集合中第一个和最后一个元素的下标值,如果索引表使用的字符串下标,会按照字符串进行排序后返回。如果集合的长度为0FIRST函数和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没有上一个索引值,则返回NULLNEXT(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) 
在集合末尾添加nNULL元素
EXTEND(n,i)
把第i个元素值拷贝n份添加到集合末尾
注意:如果在声明嵌套表或可变数组时指定了NOT NULL,那么该过程的前两种形式就不能在使用了。
   
使用EXTEND过程时,嵌套表情况会稍稍复杂一点,因为嵌套表可能会删除元素。以下示例演示了嵌套表元素在内存中的分布结构:
DECLARE
TYPE DNameTableList IS TABLE OF VARCHAR2(14);
nameTableList DNameTableList:=DNameTableList(NULL,'
综合部','市场部','社教部');
内存结构如下:


调用nameTableList.EXTEND后结构如下:


此时nameTableList.COUNT5nameTableList.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.COUNT3nameTableList.LAST值为3,如果调用nameTableList(4):='CORESUN' 则会抛出SUBSCRIPT_BEYOND_COUNT异常。

八、DELETE过程
DELETE过程用于删除嵌套表和索引表的元素,该过程不能用于可变数组。它有以下三种重载的形式:
DELETE   
删除集合中的所有元素,可用于可变数组,删除后集合变量为NULL
DELETE(n) 删除索引为n的元素,不可用于可变数组。
DELETE(m,n) 删除索引从mn的所有元素,不可用于可变数组。
以下示例演示从嵌套表中使用DELETE删除元素及元素在内存中的结构:
DECLARE
TYPE DNameTableList IS TABLE OF VARCHAR2(14);
nameTableList DNameTableList:=DNameTableList(NULL,'
合部','','社教部');

调用nameTableList.DELETE(4)后,内存结构如下:


嵌套表占用的内存是动态的,删除时会被自动释放,但PL/SQL会在嵌套表中使用占位符标识该位置。此时nameTableList.COUNT3nameTableList.LAST值为3,如果调用nameTableList(4):='CORESUN' 则不会抛出异常,内存结构如下:


此外注意以下几种形式的调用:
nameTableList.DELETE(4,4)  删除索引为4的元素
nameTableList.DELETE(5,2) 
什么都不做
nameTableList.DELETE('China') 
删除索引为'China'的元素
nameTableList.DELETE('China','Japan') 
删除从索引ChinaJapan之间的元素

你可能感兴趣的:(oracle,sql)