文档

变长数组

更新时间:

变长数组是一种元素数量可以从零到声明的最大长度的数组。

语法

TYPE type_name IS VARRAY '(' number ')' OF datatype [NULL | NOT NULL] ';'

示例

变长数组的基本示例如下所示:

DECLARE
  TYPE varray_type IS VARRAY(10) OF INT; -- 声明 varray 局部类型
  v varray_type := varray_type();  -- 创建变量, 并将它初始化为空
BEGIN
  v.extend(1); -- 扩建它的大小, 之后允许在索引为1的位置上赋值和取值
  v(1) := 1; -- 赋值
  RAISE NOTICE '%', v(1); -- 取值
END;

结果显示如下:

NOTICE:  1
DO

该语法指定了您创建的类型名称、变长数组的最大长度和元素类型。您可以使用该类型创建变量。以下是创建变长数组变量的一个示例:

DECLARE
  TYPE varray_type IS VARRAY(10) OF INT; -- 声明 varray 局部类型
  v varray_type; -- 创建变量但不初始化, 此时状态为 NULL
  v varray_type := varray_type();  -- 创建变量, 并将它初始化为空,实际长度为0
  v varray_type := varray_type(1, 2); -- 创建变量, 并初始化两个元素, 实际长度为2
BEGIN
END;

您必须通过extend方法或是直接在初始化时分配出对应的位置,然后才可以对该位置进行赋值和取值。变长数组的索引下标的下界为1,上界为当前存储的元素个数。存储的元素个数不能超过设定的最大值。如果您试图分配超过最大长度的位置,PL/SQL会出现如下错误:

DECLARE
  TYPE varray_type IS VARRAY(10) OF INT;
  v varray_type := varray_type();
BEGIN
  v.extend(11); -- 分配11个位置
END;

结果显示如下:

ERROR:  new varray size: 11 must be smaller than limit size: 10
CONTEXT:  SQL statement "CALL v.extend(11)"
PL/SQL function inline_code_block line 5 at CALL

元素类型可以是普通类型(例如,int,varchar等),也可以是记录类型。

DECLARE
  TYPE record_type IS RECORD(id INT, name VARCHAR(10));
  TYPE varray_type IS VARRAY(10) OF record_type;
  v varray_type := varray_type();
BEGIN
  v.extend(1);
  v(1).id := 1;
  v(1).name := 'a';
  RAISE NOTICE '% %', v(1).id, v(1).name;
END;

结果显示如下:

NOTICE:  1 a
DO