编辑 : 根据 答案 , 这 在 21C 中 工作 , 但 在 21C 之前 不 工作 。 看 起来 像 是 一 个 Oracle 错误 , 已经 修复 。 以前 版本 中 的 解决 方法 作为 可 接受 的 答案 提供 。
在 PL/SQL 中 , 嵌套 表 的 子 类型 与 常规 嵌套 表 的 行为 不 一致 。 似乎 无法 使用 嵌套 表 的 子 类型 。 这 是否 正确 ?
create or replace package test_subtype_pkg
is
type t_foos is table of varchar2(10);
subtype t_bars is t_foos;
procedure main;
end;
/
中 的 每 一 个
下列 l_bars := t_bars()
无法 与 PLS-00355: use of pl/sql table not allowed in this context
一起 编译
create or replace package body test_subtype_pkg
is
procedure main
is
l_foos t_foos;
l_bars t_bars;
begin
l_foos := t_foos(); -- compiles correctly
l_bars := t_bars(); -- PLS-00355: use of pl/sql table not allowed in this context
end;
end;
/
格式
但是 , 下面 的 编译 没有 错误 。 在 运行 时 , 编译 失败 , 返回 ORA-06531: Reference to uninitialized collection
:
create or replace package body test_subtype_pkg
is
procedure main
is
l_bars t_bars;
begin
l_bars.extend; -- At run time, ORA-06531: Reference to uninitialized collection
l_bars(1) := 'foo';
end;
end;
/
格式
是否 可以 使用 嵌套 表 的 子 类型 ?
2条答案
按热度按时间owfi6suc1#
您 可以 使用 子 类型 , 但 只有 在 您 从 基底 类型 呼叫 建构 函 式 时 , 子 类型 才 能 运作 :
中 的 每 一 个
NEW
关键 字 是 可选 的 。 *编译 无误 , 然后 :
格式
工作 时 不会 出现 运行 时 错误 。
Oracle 18 fiddle 的 最 大 值
5sxhfpxr2#
我没有18 c;这是21 cXE,两个代码都工作正常。
您说这在您的数据库中失败;这对我很有效:
您的代码可以编译,但不能工作-这是因为您实际上没有初始化集合(见第5行,其中显示了如何进行初始化):