文档

集合变量的赋值

更新时间:

本文介绍了为集合变量赋值的方式。

简介

您可以通过以下方式为集合变量赋值:

  • 调用构造函数来创建集合并将其分配给集合变量。

  • 使用赋值语句将另一个现有集合变量的值赋给它。

  • 将其作为OUTIN OUT参数传递给子程序,然后在子程序内赋值。仅支持变长数组和嵌套表作为子程序的参数。不允许关联数组作为子程序的参数。

  • 使用collection(index) = value的形式为集合变量的元素赋值。

说明

仅当两个集合具有相同的或是可以隐式类型转换的元素类型时,才可以将它们互相赋值。

示例

以下是一个赋值成功的示例。

DECLARE
  TYPE char_col1 IS VARRAY(3) OF CHAR(5);
  TYPE char_col2 IS VARRAY(3) OF CHAR(5);
  TYPE int_col IS VARRAY(3) OF INT;
 
  group1 char_col1 := char_col1('1', '2', '3');
  group2 char_col2;
  group3 int_col;
BEGIN

  group2 := group1; -- 不同的集合类型, 但相同的元素类型
  RAISE NOTICE 'group2:';
  FOR i IN 1..3 LOOP
    RAISE NOTICE '%', group2(i);
  END LOOP;

  group3 := group1; -- 不同的集合类型, 但可以隐式转换的元素类型
  RAISE NOTICE 'group3:';
  FOR i IN 1..3 LOOP
    RAISE NOTICE '%', group3(i);
  END LOOP;
END;

显示结果如下:

NOTICE:  group2:
NOTICE:  1    
NOTICE:  2    
NOTICE:  3    
NOTICE:  group3:
NOTICE:  1
NOTICE:  2
NOTICE:  3
DO

当隐式转换失败时,则会在对应的元素赋值时抛出错误。以下是一个赋值失败的示例。

DECLARE
  TYPE char_col IS VARRAY(3) OF CHAR(5);
  TYPE int_col IS VARRAY(3) OF INT;
 
  group1 char_col := char_col('1', 'a'); -- 显然, a无法转换为int类型
  group2 int_col;
BEGIN
  group2 := group1;
END;

显示结果如下:

ERROR:  invalid input syntax for type integer: "a    "
CONTEXT:  PL/SQL function inline_code_block line 8 at assignment

您可以使用NULL将一个初始化过的变长数组或嵌套表重新赋值为NULL。

DECLARE
  TYPE nt_type IS TABLE OF INT;
  nt nt_type; -- 初始状态为 NULL

  PROCEDURE print_status IS
  BEGIN
    IF nt IS NULL THEN
      DBMS_OUTPUT.PUT_LINE('nt is null.');
    ELSE
      DBMS_OUTPUT.PUT_LINE('nt is not null.');
    END IF;
  END;
BEGIN
  print_status;
  nt = nt_type(); -- 初始化为空, 不为 NULL
  print_status;
  nt = NULL; -- 将其赋值为 NULL
  print_status;
END;

显示结果如下:

nt is null.
nt is not null.
nt is null.
DO

关联数组变量永远不会为NULL,因此将NULL赋值给关联数组变量会直接报错。

DECLARE
  TYPE aarray_type IS TABLE OF INT INDEX BY VARCHAR(10);
  aarray aarray_type := NULL; -- 赋值为 NULL
BEGIN
END;

显示结果如下:

ERROR:  can not assign NULL to associative array
CONTEXT:  PL/SQL function inline_code_block line 4 during statement block local variable initialization
  • 本页导读 (0)
文档反馈