本文介绍了为集合变量赋值的方式。
简介
您可以通过以下方式为集合变量赋值:
调用构造函数来创建集合并将其分配给集合变量。
使用赋值语句将另一个现有集合变量的值赋给它。
将其作为
OUT
或IN 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
文档内容是否对您有帮助?