oracle 嵌套表PLS-00355的PLSQL子类型:不允许在此上下文中使用pl/sql表

ql3eal8s  于 2022-11-22  发布在  Oracle
关注(0)|答案(2)|浏览(215)

编辑 : 根据 答案 , 这 在 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;
/

格式
是否 可以 使用 嵌套 表 的 子 类型 ?

owfi6suc

owfi6suc1#

您 可以 使用 子 类型 , 但 只有 在 您 从 基底 类型 呼叫 建构 函 式 时 , 子 类型 才 能 运作 :

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;
/

create or replace package body test_subtype_pkg
is
    procedure main
    is
        l_foos t_foos;
        l_bars t_bars;
    begin
        l_foos := new t_foos();
        l_bars := new t_foos();
        l_bars.extend;
        l_bars(1) := 'foo';
    end;
end;
/

中 的 每 一 个

  • 注意 : NEW 关键 字 是 可选 的 。 *

编译 无误 , 然后 :

BEGIN
  test_subtype_pkg.main();
END;
/

格式
工作 时 不会 出现 运行 时 错误 。

  • 注意 : 在 第 二 个 示例 中 , 您 会 得到 运行 时 错误 , 因为 您 没有 初始 化 集合 , 因为 您 从未 调用 构造 函数 。 *

Oracle 18 fiddle 的 最 大 值

5sxhfpxr

5sxhfpxr2#

我没有18 c;这是21 cXE,两个代码都工作正常。

SQL> select banner from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production

SQL> create or replace package test_subtype_pkg
  2  is
  3      type t_foos is table of varchar2(10);
  4      subtype t_bars is t_foos;
  5
  6      procedure main;
  7  end;
  8  /

Package created.

您说这在您的数据库中失败;这对我很有效:

SQL> create or replace package body test_subtype_pkg
  2  is
  3      procedure main
  4      is
  5          l_foos t_foos;
  6          l_bars t_bars;
  7      begin
  8          l_foos := t_foos(); -- compiles correctly
  9          l_bars := t_bars(); -- PLS-00355: use of pl/sql table not allowed in this context
 10      end;
 11  end;
 12  /

Package body created.

SQL> exec test_subtype_pkg.main;

PL/SQL procedure successfully completed.

SQL>

您的代码可以编译,但不能工作-这是因为您实际上没有初始化集合(见第5行,其中显示了如何进行初始化):

SQL> create or replace package body test_subtype_pkg
  2  is
  3      procedure main
  4      is
  5          l_bars t_bars := t_bars();
  6      begin
  7          l_bars.extend; -- At run time, ORA-06531: Reference to uninitialized collection
  8          l_bars(1) := 'foo';
  9      end;
 10  end;
 11  /

Package body created.

SQL> exec test_subtype_pkg.main;

PL/SQL procedure successfully completed.

SQL>

相关问题