`

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字符相似度函数

    Oracle字符相似度函数是Oracle数据库系统提供的一种功能,用于评估两个字符串之间的相似性。这个功能在数据清洗、信息检索、文本分析等领域具有广泛的应用。在SQL查询中,我们可以直接使用这些函数来比较不同字符串...

    Oracle中实现Split函数功能

    Oracle 中实现 Split 函数功能的优点是可以灵活地处理不同的分隔符和字符串长度。同时,这个函数也可以与其他 Oracle 函数和操作符结合使用,以实现更加复杂的数据处理任务。 在实际应用中,Oracle 中实现 Split ...

    oracle常用字符函数

    Oracle数据库中的字符函数是SQL和PL/SQL编程中不可或缺的一部分,它们主要用于处理和操作文本数据。以下是对给定文件中提到的一些主要字符函数的详细解释: 1. ASCII(n) 函数: - 该函数返回字符串的第一个字符的...

    Oracle学习笔记(嵌套表、可变数组)

    Oracle学习笔记(嵌套表、可变数组),有具体的代码案例供大家参考

    字符串分割成数组函数(plsql function)

    将字符串分割成数组: 例如将字符串“7369,7499,7521,7844"分割成 7369 7499 7521 7844 用法:可以将分割结果做为一个数组或者数据库表列来使用 select * from scott.emp where empno in (select column_value from...

    oracle_split_函数_返回数组

    在Oracle数据库中,由于内置函数不直接支持像Java中的`split`那样拆分字符串并返回数组,因此开发者需要自定义函数来实现这一功能。这里提到的两种方法都是为了解决这个问题,即根据指定的分隔符将字符串拆分为一个...

    oracle遍历数据库查找字符串

    INSTR函数则用来查找子串在目标字符串中的位置,返回值为0表示未找到。但手工编写这些查询对于大规模数据库可能非常繁琐且耗时。 这个名为"oracle遍历数据库查找字符串.jar"的工具可能实现了以下功能: 1. **连接...

    oracle常用函数举例

    3.CONCAT:连接两个字符串; SQL> select concat('010-','88888888')||'转23' 张三电话 from dual; 张三电话 ---------------- 010-88888888转23 4.INITCAP:返回字符串并将字符串的第一个字母变为大写; SQL> select ...

    Java调用oracle函数返回oracle类(类似)集合

    在Java中调用Oracle函数并处理返回的Oracle特定数据类型,如集合或索引表,通常涉及到Oracle的PL/SQL包和Java的JDBC驱动。以下是对这个主题的详细说明: 1. **Oracle索引表类型**: Oracle索引表是一种PL/SQL数据...

    oracle系统内置函数大全

    Oracle数据库系统内置了大量函数,这些函数可以分为多个类别,例如字符函数、数字函数、日期函数、转换函数、分组函数以及其他辅助函数等。以下是对每个类别中一些常用函数的详细介绍: 字符函数 1. ASCII函数:...

    Oracle函数返回表

    Oracle自定义函数返回一张表。主要用于生成一张等时间间隔的表数据。

    Oracle内建函数大全

    - TO_CHAR/TO_DATE:将日期时间转换为字符串或将字符串转换为日期时间。 4. **转换函数** - TO_NUMBER:将字符串转换为数值。 - TO_CHAR:将数值、日期或其他类型转换为字符串。 - CAST:在不同数据类型间进行...

    oracle可变数组

    查询包含可变数组的表时,可以使用`TABLE`函数将可变数组转换为表进行查询。 ```sql SELECT user_comm FROM user_info WHERE user_id = 1; SELECT comm_type, comm_no FROM TABLE(SELECT user_comm FROM user_info...

    oracle函数大全(CHM格式).rar

    Oracle数据库中的函数可以分为多种类型,包括内置函数、数学函数、字符串函数、日期时间函数、转换函数、系统信息函数等。例如: 1. **内置函数**:如`SYSDATE`用于获取当前系统日期,`USER`获取当前登录用户的...

    oracle 10G函数大全

    在Oracle 10G中,函数是SQL和PL/SQL编程中不可或缺的一部分,它们用于处理数据、进行计算、操作字符串以及执行各种其他任务。本资料“Oracle 10G函数大全”显然是一份全面的参考指南,涵盖了Oracle 10G中的主要函数...

    MLDN魔乐科技JAVA培训_Oracle课堂24_嵌套表、可变数组.rar

    本课程"MLDN魔乐科技JAVA培训_Oracle课堂24_嵌套表、可变数组"着重讲解了Oracle数据库中的两种特殊数据结构——嵌套表和可变数组,它们在处理复杂数据时非常有用。 嵌套表,也称为集合类型,允许在一个列中存储多个...

    Oracle10G函数大全(chm格式的,比较全面)

    Oracle 10G是Oracle数据库的一个重要版本,它包含了丰富的函数和特性,为数据库管理和开发提供了强大的支持。本文将深入探讨Oracle 10G中的一些关键函数,旨在帮助你更好地理解和利用这些工具。 1. **数学函数**: ...

    Oracle基本语句和基本函数

    4. 转换函数:TO_NUMBER()将字符串转换为数字,CAST()通用类型转换。 5. 控制流程函数:IFNULL()或NVL()处理空值,DECODE()用于简单的条件判断。 三、其他重要概念 1. 视图:视图是从一个或多个表中创建的虚拟表,...

    oracle函数大全

    11. 转换日期为字符串或者字符串为日期,使用 TO_CHAR 和 TO_DATE 函数 二、数值函数 1. 四舍五入函数 ROUND,用于对数值进行四舍五入操作 2. 求最大或最小值 MAX 和 MIN 3. 求平均值 AVG 4. 求和 SUM 三、日期和...

Global site tag (gtag.js) - Google Analytics