Skip to content

适用虚谷数据库版本

v12.9



适用虚谷数据库版本

v12.9


复合类型

📄字数 9.9K
👁️阅读量 加载中...

在 PL/SQL 中,复合类型(Composite Types)允许将多个相关的值组织在一起,形成一个逻辑单元。复合类型主要包括记录类型(Record)、集合类型(Collection)。PL/SQL 中定义的集合类型是本地类型,仅在块中可用。

记录类型

记录类型由多种不同基本数据类型或自定义类型的元素组合成的数据类型,使用点号.访问记录的每个字段成员,通常在 PL/SQL 中使用。

提示

  • 不支持为 record 数据添加新成员或删除已有成员。

语法格式

  • 初始化方法
  1. 声明一个记录类型,然后声明一个该类型的变量并初始化为 EMPTY:

    sql
    var_name rec_name;
  2. 声明一个变量,类型与表字段组合类型关联并初始化为 EMPTY:

    sql
    c_1 table_name%ROWTYPE;
    c_1 table_name%TYPE;
  3. 声明一个变量,类型与游标类型关联并初始化为 EMPTY:

    sql
    c_1 cursor_name%ROWTYPE;
    c_1 cursor_name%TYPE;
  4. 用构造函数初始化:

    sql
    var_name rec_name := rec_name(c_1_value, ..., c_n_value);

参数说明

  • rec_name:新定义的记录类型的名称。可以选择任何合法的标识符作为名称。

  • ColumnName:记录中的各个字段(列)名称。

  • type_name:各个字段的数据类型。这些数据类型可以是基础类型,也可以是用户自定义的数据类型。

  • var_name:基于 rec_name 类型的变量的名称。这个变量可以用来存储符合 rec_name 结构的数据。

  • c_1_value, ..., c_n_value:记录中的各个字段(列)的值。

  • %TYPE:主要用于声明某个与其他变量类型(例如,表中某列的类型)相同的变量。

  • %ROWTYPE:主要用于对一组数据的类型声明,用于存储表中的一行数据或从游标匹配的结果。

  • 示例:

sql
SQL> CREATE TABLE employees_tab(id INT, first_name VARCHAR, last_name VARCHAR);

SQL> INSERT INTO employees_tab VALUES(1,'zhang','san')(2,'li','si')(3,'wang','wu'); 

SQL> DECLARE
      -- 定义 RECORD 类型
      TYPE t_rec IS RECORD(
          id       INT,
          emp_type employees_tab%ROWTYPE);
      -- 声明 RECORD 类型变量
      rec t_rec;
     BEGIN
       -- 赋值
      rec.id := 1;
      -- 通过 employees 表赋值
      SELECT * INTO rec.emp_type FROM employees_tab WHERE id = 1;
      SEND_MSG(rec.id || ':' || rec.emp_type.first_name || rec.emp_type.last_name);
     END;
      /

-- 输出
1:zhangsan
  • 示例:
sql
-- 定义了一个记录类型 t_rec,并创建了一个该类型的变量 var_rec
-- 然后初始化这个变量,并使用 DBMS_OUTPUT.PUT_LINE 输出变量的内容
SQL> DECLARE
      -- 定义RECORD类型
      TYPE t_rec IS RECORD(
          id       NUMERIC,
          name     VARCHAR2,
          birthday DATE);
      -- 声明 RECORD 类型变量
      var_rec T_REC;
     BEGIN
      -- 赋值
      var_rec := T_REC(10, 'David', '2025-06-19');
      -- 通过 var_rec.[字段名]访问成员并输出
      DBMS_OUTPUT.PUT_LINE('Person Info: (' || var_rec.ID || ', ' ||var_rec.NAME || ', ' || var_rec.BIRTHDAY || ')');
     END;
      /

-- 输出
Person Info: (10, David, 2025-06-19 00:00:00)
  • 示例:
sql
-- 构造函数初始化
SQL> DECLARE 
        -- 定义 RECORD 类型,并初始化 
        TYPE t_rec IS RECORD(id INT, name VARCHAR);
        v_rec1 t_rec:= t_rec(1,'张三');
     BEGIN
        IF v_rec1 IS NULL THEN 
          SEND_MSG('v_rec1 is null');
        ELSE
          SEND_MSG(v_rec1.id ||':'||v_rec1.name);  
        END IF;  
     END;  
     / 

-- 输出结果
1:张三
  • 示例:
sql
SQL> CREATE TABLE record_tab(v1 INT,v2 VARCHAR);

-- RECORD 与表类型结合使用
SQL> DECLARE 
        TYPE type_record IS RECORD (c1 INT,c2 VARCHAR);
        v1 type_record;
        TYPE type_tab_record IS TABLE OF type_record;
        v_tab type_tab_record;
     BEGIN
        -- 初始化空表
        v_tab := type_tab_record();
        -- 扩展表以容纳1个元素,可按需扩展大小
        v_tab.EXTEND(1);
        -- 使用记录构造函数赋值
        v1 := type_record(1, 'abc');
        v_tab(1) := v1;
        INSERT INTO record_tab VALUES(v_tab(1).c1, v_tab(1).c2);
     END;
     /

SQL> SELECT *FROM record_tab WHERE v1 = 1;
+----+-----+
| V1 | V2  |
+----+-----+
| 1  | abc |
+----+-----+
  • 示例:
sql
-- RECORD 与数组类型结合使用
SQL> DECLARE 
        TYPE type_record IS RECORD (c1 INT,c2 VARCHAR);
        v1 type_record;
        TYPE type_tab_record IS VARRAY(5) OF type_record;
        v_tab type_tab_record;
     BEGIN
        -- 初始化空数组
        v_tab := type_tab_record();
        v_tab.EXTEND(1);
        -- 使用记录构造函数赋值
        v1 := type_record(2, 'def');
        v_tab(1) := v1;
        INSERT INTO record_tab VALUES(v_tab(1).c1, v_tab(1).c2);
     END;
     /

SQL> SELECT *FROM record_tab WHERE v1 = 2;
+----+-------------+
| V1 |     V2      |
+----+-------------+
| 2  |     def     |
+----+-------------+
  • 示例:
sql
-- RECORD 与结构类型结合使用
SQL> CREATE OR REPLACE TYPE type_obj AS OBJECT(v1 VARCHAR, V2 VARCHAR);

SQL> DECLARE 
        TYPE type_record IS RECORD (c1 INT, c2 type_obj);
        v1 type_record;
     BEGIN
        v1.c1 := 3;
        v1.c2 := type_obj('四川','成都');
        INSERT INTO record_tab VALUES(v1.c1, '(' || v1.c2.v1 || ',' || v1.c2.v2 || ')');
     END;
     /

SQL> SELECT *FROM record_tab WHERE v1 = 3;
+----+-------------+
| V1 |     V2      |
+----+-------------+
| 3  | (四川,成都) |
+----+-------------+

集合类型

集合类型概述

数据库提供了变长数组(VARRAY)、嵌套表(TABLE)、索引表(ITABLE,也称联合数组)三种同质元素的集合类型。

以上三者区别如下表所示:

属性变长数组(VARRAY)嵌套表(TABLE)索引表(ITABLE)
是否可用于SQL可用可用不可用
表字段类型可用,数据在同一表中可用,数据在同一表中不可用
初始化声明时自动完成声明时自动完成声明时自动完成
未初始化状态引用时非法访问引用时非法访问元素未定义
数据连续性连续连续,删除后不连续不连续(稀疏)
是否有界有size界可以扩展无界
扩展方法EXTENDEXTEND,EXTEND()给新元素赋值
比较操作支持支持支持
集合操作支持支持支持
元素数量指定的未指定的未指定的
索引类型整数整数整数或字符串
密集或稀疏总是密集的开始密集,删除中间值变得稀疏稀疏
定义或声明在PL/SQL块、包、存储过程、
存储函数或在模式级别中
在 PL/SQL 块、包、存储过程、
存储函数或在模式级别中
在 PL/SQL 块、包、存储过程、
存储函数或在模式级别中
  • 元素数量
    • 如果指定了元素数量,则即是集合中元素的最大数量;如果未指定元素数量,则集合中的最大元素数量是索引类型的上限。
  • 密集或稀疏
    • 密集集合是指在元素之间没有空隙,即第一个元素与最后一个元素之间的每个元素都被定义;稀疏集合是指在元素之间存在空隙。
  • 未初始化状态
    • 存在一个没有任何元素的空集合,如果要将元素添加到空集合中,需调用 EXTEND 方法。如果要将NULL集合更改为有效集合,必须将其初始化为空,即将其设为空或分配一个非 NULL 值。

提示

  • 若在 SQL 中使用集合类型,必须是在模式级别中通过 CREATE TYPE 语句创建的类型(如:表字段类型若为集合类型,则该集合类型是模式级别创建的类型)。

PL/SQL 中使用集合类型主要分为以下三步来完成:

  • 1:声明。
  • 2:初始化。
  • 3:赋值。

集合初始化和赋值

  • 集合的初始化主要通过构造函数进行初始化。

  • 集合的变量赋值

    • 调用构造函数以创建一个集合并将其赋值给集合变量。
    • 使用赋值语句为其赋值一个现有集合变量的值。
  • 示例:

sql
-- 1:在声明块中声明集合,在声明块中使用构造函数初始化,在执行块中使用 EXTEND 方法进行赋值
 SQL> DECLARE  
        TYPE type_name IS VARRAY(1) OF INT;
        -- 声明集合,使用构造函数初始化
        variable_name type_name:= type_name();
      BEGIN
        -- 使用 EXTEND 赋值
        variable_name.EXTEND;
        variable_name(1) := 1;
        SEND_MSG(variable_name(1));
      END;
       /

-- 输出
1

-- 2:在声明块中声明集合,在声明块中使用构造函数初始化并赋值
SQL> DECLARE
        
        TYPE type_name IS VARRAY(1) OF NUMBER;
        -- 声明集合,使用构造函数初始化并赋值
        variable_name type_name:= type_name(1);
     BEGIN
        SEND_MSG(variable_name(1));
     END;
      /

-- 输出
1

-- 3:在声明块中声明集合,在执行块使用构造函数初始化为空(EMPTY),在执行块中使用 EXTEND 方法进行赋值
SQL> DECLARE
        TYPE type_name IS VARRAY(1) OF NUMBER;
        -- 声明集合
        variable_name type_name;
     BEGIN
        -- 使用构造函数初始化为空
        variable_name := type_name();
        -- 使用 EXTEND 赋值
        variable_name.EXTEND;
        variable_name(1) := 1;
        SEND_MSG(variable_name(1));
     END;
      /

-- 输出
1

-- 4:在声明块中声明集合,在执行块使用构造函数初始化并赋值 
SQL> DECLARE 
        TYPE type_name IS VARRAY(1) OF BIGINT;
        -- 声明集合
        variable_name type_name;
     BEGIN
        -- 使用构造函数初始化并赋值
        variable_name := type_name(1);
        SEND_MSG(variable_name(1));
     END;
      /

-- 输出
1

提示

  • 初始化为空表示的是一个空集合(EMPTY,但非NULL),而未初始化时是NULL(UNKNOWN值)。变成数组类型(VARRAY)和嵌套表类型(TABLE)在赋值之前必须初始化,可以用EXTEND扩展,用构造函数初始化,而索引表(ITABLE)无需初始化。
  • 多维集合

XuguDB 支持使用集合构建多维集合,即多维集合的单个元素是一个集合。

  • 示例: 多维集合
SQL
SQL> DECLARE
         --定义一个可变数组类型 type_var1,它的最大容量是3,元素类型是 INT
         TYPE type_var1 IS VARRAY(3) OF INT;
 
         -- 定义一个可变数组类型 type_var2,它的最大容量是5,元素类型是 type_var1
         TYPE type_var2 IS VARRAY(5) OF type_var1;
  
         -- 定义一个类型为 type_var2 的可变数组变量 var
         var type_var2 := type_var2(type_var1(1,2,3), type_var1(4,5,6), type_var1(7,8,9));
 
      BEGIN 
         FOR i IN 1..3 LOOP
            FOR j IN 1..2 LOOP
               SEND_MSG(VAR(i)(j));
            END LOOP;
         END LOOP;
      END;
      /

-- 输出
1
2
4
5
7
8

提示

  • 初始化和赋值可以在声明块中完成,也可以在执行块中完成。集合类型在声明变量时,自动完成初始化。

变长数组

​​变长数组(VARRAY)是一种元素有序、类型统一且容量可控的动态数组​​:它存储一组数据类型相同的元素,通过下标(索引)定位元素位置,元素容量可在声明时设定的固定上限内动态调整。

语法格式

参数说明

  • type_name:定义的集合类型的名称,用于变量声明(如:variable_name type_name;)。

  • VARRAY(size):变长数组,其中 size 是这个数组的最大长度。

  • type_x

    • Stypename: 数据类型,可以是基本数据类型(如:NUMBER、VARCHAR2等)或其他用户自定义类型。
    • name_space:表对象或字段名,当使用 %TYPE 时需指定字段名,表示该字段的数据类型;其余两种情况均指定表对象名,表示行类型。
  • 示例:

sql
SQL> DECLARE
        TYPE players IS VARRAY(5) OF VARCHAR(20);   
        team players := players('Zhangsan', 'Lisi', 'Wangwu', 'Mazi','Chouchong');
     BEGIN
         FOR i IN 1..5 LOOP
            DBMS_OUTPUT.PUT_LINE(i || '.' || team(i));
         END LOOP;
     END;
     /

-- 输出
1.Zhangsan
2.Lisi
3.Wangwu
4.Mazi
5.Chouchong

嵌套表

嵌套表是 PL/SQL 中一种强大的非固定大小、可稀疏存储的集合类型,在数据库表和 PL/SQL 程序中都具有重要的应用价值,适合处理元素数量未知、需要动态增长且可能不连续存储的数据集。

语法格式

参数说明

  • type_name:定义的集合类型的名称,用于变量声明(如:variable_name type_name;)。

  • type_x

    • Stypename: 数据类型,可以是基本数据类型(如:NUMBER、VARCHAR2等)或其他用户自定义类型。
    • name_space:表对象或字段名,当使用 %TYPE 时需指定字段名,表示该字段的数据类型;其余两种情况均指定表对象名,表示行类型。
  • 示例:

sql
SQL> DECLARE
         TYPE tab_type IS TABLE OF VARCHAR(20);
         -- 使用构造函数初始化带元素
         v_names tab_type := tab_type('Alice', 'Bob', 'Charlie');
     BEGIN
         FOR i IN  v_names.FIRST .. v_names.LAST LOOP
            SEND_MSG(v_names(i));
         END LOOP;
     END;
      /

-- 输出
Alice
Bob
Charlie
  • 示例: %ROWTYPE
sql
SQL> CREATE TABLE employees_tab(id INT, first_name VARCHAR, last_name VARCHAR);

SQL> INSERT INTO employees_tab VALUES(1,'zhang','san')(2,'li','si')(3,'wang','wu'); 

-- 定义可存储 employees_tab 表多行数据的嵌套表类型
SQL> DECLARE
         TYPE emp_rec IS TABLE OF employees_tab%ROWTYPE; 
         emp emp_rec;
     BEGIN
         -- 初始化
          emp := emp_rec();
          -- 添加一个元素
         emp.EXTEND;
          SELECT * INTO emp(1) FROM employees_tab WHERE id = 1;
         DBMS_OUTPUT.PUT_LINE(emp(1).first_name || ' ' || emp(1).last_name);
     END;
     /

-- 输出
zhang san

索引表

索引表是通过唯一键(下标)快速定位值的动态结构​​:它以键值对形式存储数据,其中​​键(Key)​唯一且支持整数或字符串类型,用于标识元素位置;值(Value)存储实际数据,其类型由用户定义。键与值的映射关系允许通过键直接访问对应元素,无需顺序遍历。

语法格式

参数说明

  • type_name:定义的集合类型的名称,用于变量声明(如:variable_name type_name;)。

  • type_x

    • Stypename: 数据类型,可以是基本数据类型(如:NUMBER、VARCHAR2等)或其他用户自定义类型。
    • name_space:表对象或字段名,当使用 %TYPE 时需指定字段名,表示该字段的数据类型;其余两种情况均指定表对象名,表示行类型。
  • 索引键值类型

    • INDEX BY PLS_INTEGER:表的索引是基于整数的。索引可以是非连续的,可以从任何整数值开始。
    • VARCHAR:表的索引是基于字符串的,为稀疏型。
  • 示例:

sql
SQL> DECLARE   
          -- 关联数组的类型为 NUMBER,索引的类型是字符串
         TYPE type_money IS TABLE OF NUMBER INDEX BY VARCHAR2(64);          
         salary type_money;            
         n  VARCHAR2(64);                   
     BEGIN
         -- 向索引表中添加键值对
         salary('ZhangSan') := 1000;
         salary('LiSi') := 2000;
         salary('WangWu') := 3000;
         -- 获取第一个元素
         n := salary.FIRST;   
         WHILE n IS NOT NULL
         LOOP
            DBMS_OUTPUT.PUT_LINE('Salary of ' || n || ' is ' || salary(n));
           -- 获取下一个元素
            n := salary.Next(n);    
         END LOOP;
      END;
      /

-- 输出
Salary of LiSi is 2000
Salary of WangWu is 3000
Salary of ZhangSan is 1000

集合方法

集合方法是一系列返回有关集合的信息的函数或对集合进行操作的过程。

1.DELETE

功能如下表所示:

集合方法描述限制
DELETE删除集合所有元素通用
DELETE(n)删除集合下标为n的元素对VARRAY非法
DELETE(n,m)删除集合下标为n~m的元素对VARRAY非法
  • 详细解释

DELETE用于删除集合中的元素。

DELETE有三种形式:

  • DELETE:从集合中删除所有元素,适用于三种类型的集合。
  • DELETE(n):删除索引为n的元素(如果该元素存在),否则不进行任何操作,不适用于 VARRAY。
  • DELETE(n, m):删除索引n~m的元素,不适用于 VARRAY。

DELETE删除元素不会删除该元素的占位符,可以直接赋值给被删除元素进行恢复。

  • 示例:
sql
SQL> DECLARE
        TYPE e_type IS TABLE OF NUMBER;
        e e_type := e_type(1, 2, 3, 4);
     BEGIN
        -- 删除索引2到5的元素(5不存在)
        e.DELETE(2, 5);
        FOR i IN e.FIRST .. e.LAST LOOP
          SEND_MSG(e(i));
        END LOOP;
        -- 重新赋值索引2的元素
        e(2) := 22;
        FOR i IN e.FIRST .. e.LAST LOOP
          SEND_MSG(e(i));
        END LOOP;
     END;
      /

-- 输出
1
-- 第二次操作输出,被DELETE删除的元素可以直接重新赋值
1
22

2.TRIM

功能如下表所示:

集合方法描述限制
TRIM从集合末端开始删除1个元素对ITABLE非法
TRIM(n)从集合末端开始删除n个元素对ITABLE非法
  • 详细解释

TRIM用于从变长数组或嵌套表的末尾删除元素并销毁位置,不支持索引表。

TRIM有两种形式:

  • TRIM:如果集合至少有一个元素,则 TRIM 从集合末尾删除1个元素;反之会报错[E5210] 下标1超界
  • TRIM(n):如果集合末尾至少有n个元素,则从集合末尾删除n个元素;反之会报错[E5210] 下标n超界

DELETE删除一个元素但会保留占位符,而TRIM处理时会认为该元素存在(占据一个位置),将被删除元素的占位符销毁。因此,TRIM可以销毁已删除的元素。

  • 示例:
sql
SQL> DECLARE
        TYPE e_type IS TABLE OF NUMBER;
        e e_type := e_type(1, 2, 3, 4);
     BEGIN
        -- 从集合末端开始删除2个元素
        e.TRIM(2);
        FOR i IN e.FIRST .. e.LAST LOOP
          SEND_MSG(e(i));
        END LOOP;
     END; 
      /
-- 输出
1
2
  • 示例:
sql
SQL> DECLARE
        TYPE e_type IS VARRAY(5) OF NUMBER;
        e e_type := e_type(1, 2, 3, 4);
     BEGIN
        -- 从集合末端开始删除2个元素
        e.TRIM(2);
        FOR i IN e.FIRST .. e.LAST LOOP
          SEND_MSG(e(i));
        END LOOP;
     END; 
      /
-- 输出
1
2

3.EXTEND

功能如下表所示:

集合方法描述限制
EXTEND为集合添加一个元素,初始值为NULL对ITABLE非法
EXTEND(n)为集合添加n个元素,初始值为NULL对ITABLE非法
EXTEND(n,m)为集合添加n个元素,初始值为m对ITABLE非法
  • 详细解释

EXTEND用于添加元素位置到变长数组或嵌套表的末尾,并将其设置为NULL,不适用于索引表。

EXTEND有三种形式:

  • EXTEND:新增一个 NULL 元素到集合尾部。

  • EXTEND(n):新增n个 NULL 元素到集合尾部。

  • EXTEND(n, m):新增n个元素到集合尾部,并且给它们赋值索引为m的值。

  • 示例:

sql
SQL> DECLARE 
        TYPE e_type IS VARRAY(10) OF VARCHAR(10);
        e e_type; 
     BEGIN
        e.EXTEND(); 
        e(1):= 'yi'; 
        e.EXTEND(2); 
        e(3):= 'san';
        e.EXTEND(2, 3);
        FOR i IN 1..e.COUNT() LOOP
          SEND_MSG(e(i)); 
        END LOOP;
      END;
      /

-- 输出
yi
NULL
san
san
san
  • 示例:
sql
SQL> DECLARE 
        TYPE e_type IS TABLE OF NUMERIC;
        e e_type; 
     BEGIN
        e.EXTEND(); 
        e(1):= 1; 
        e.EXTEND(2); 
        e(2):= '2';
        e(3):= '3';
        e.EXTEND(2, 3);
        FOR i IN 1..e.COUNT() LOOP
          SEND_MSG(e(i)); 
        END LOOP;
      END;
      /

-- 输出
1
2
3
3
3

4.EXISTS

功能如下表所示:

集合方法描述限制
EXISTS(n)若下标为n的元素存在时,返回TRUE通用
  • 详细解释

EXISTS用于显示指定元素是否存在。
如果集合的第n个元素存在,则EXISTS(n)返回 true,否则返回 false。如果n超出范围,EXISTS将返回 false。对于已删除的元素,EXISTS(n)返回 false。

  • 示例:
sql
SQL> DECLARE
        a boolean;
        TYPE e_type IS TABLE OF NUMBER;
        e e_type := e_type(1, 2, 3);
     BEGIN
        e.DELETE(3);
        FOR i IN e.FIRST .. e.LAST LOOP
          IF e.EXISTS(i) THEN 
            SEND_MSG(1);
          ELSE
            SEND_MSG(0);
          END IF;
        END LOOP;
     END;
      /
      
--输出
1
1

5.COUNT

功能如下表所示:

集合方法描述限制
COUNT或COUNT()该集合元素的数目通用
  • 详细解释

COUNT用于返回集合中可访问的元素数量。使用EXTENDTRIMDELETE时会影响COUNT的结果。

  • 示例:
sql
SQL> DECLARE
        TYPE e_type IS TABLE OF NUMBER;
        e e_type := e_type(1, 2);
     BEGIN
        SEND_MSG(e.COUNT);
        e.EXTEND(1);
        SEND_MSG(e.COUNT);
        e.TRIM(2);
        SEND_MSG(e.COUNT);
        e.DELETE(1);
        SEND_MSG(e.COUNT);
     END; 
      /

-- 输出
2
3
1
0

6.FIRST/LAST

功能如下表所示:

集合方法描述限制
FIRST 或 FIRST()返回第一个元素索引号,空返回 NULL通用
LAST 或 LAST()返回最后一个元素索引号,空返回 NULL通用
  • 详细解释

FIRSTLAST分别用于返回第一个和最后一个元素的索引。如果集合只有一个元素,则FIRSTLAST返回相同的索引。如果集合为空,则FIRSTLAST返回NULL

  • 示例:
sql
SQL> DECLARE
        TYPE e_type IS TABLE OF NUMBER;
        e e_type := e_type(1, 2, 3);
     BEGIN
        SEND_MSG(e.FIRST);
        SEND_MSG(e.LAST);
        e.DELETE(1,2);
        SEND_MSG(e.FIRST);
        SEND_MSG(e.LAST);
        e.DELETE(3);
        SEND_MSG(e.FIRST);
        SEND_MSG(e.LAST);
    END;
    /

-- 输出
1
3
3
3
NULL
NULL

7.PRIOR/NEXT

功能如下表所示:

集合方法描述限制
PRIOR(n)返回当前元素n的前一个索引号,空返回 NULL通用
NEXT(n)返回当前元素n的下一个索引号,空返回 NULL通用
  • 详细解释

给定一个索引,PRIOR返回集合中的前一个现有元素的索引(如果存在),否则,PRIOR返回NULL。同理,NEXT返回集合中的后一个现有元素的索引(如果存在),否则,NEXT返回NULL

给定的索引不一定存在,PRIOR 和 NEXT 会根据索引类型的排序顺序查找前一个或后一个索引。

  • 示例:
sql
SQL> DECLARE
        TYPE e_type IS TABLE OF NUMBER;
        e e_type := e_type(1, 2, 3, 4);
     BEGIN
        SEND_MSG(e.PRIOR(1));
        SEND_MSG(e.NEXT(1));
        e.DELETE(2);
        SEND_MSG(e.PRIOR(2));
        SEND_MSG(e.NEXT(2));
     END;
      /

-- 输出
NULL
2
1
3

8.LIMIT

功能如下表所示:

集合方法描述限制
LIMIT返回VARRAY数组创建时指定的SIZEVARRAY
  • 详细解释

LIMIT用于返回集合的最大元素数。如果集合没有最大元素数,则LIMIT返回NULL。只有VARRAY需要设定最大元素数。

  • 示例:
sql
SQL> DECLARE
        TYPE e_type IS TABLE OF INT;
        TYPE i_type IS TABLE OF INT INDEX BY PLS_INTEGER;
        TYPE v_type IS VARRAY(10) of INT;
        e e_type;
        i i_type;
        v v_type;
     BEGIN
        -- 分别输出嵌套表、索引表和VARRAY数组创建时的SIZE
        SEND_MSG(e.LIMIT);
        SEND_MSG(i.LIMIT);
        SEND_MSG(v.LIMIT);
     END;
      /

-- 输出
NULL
NULL
10