pl/sql对象类型"ORA-06530:未初始化复合引用"错误

mut*_*oss 13 oracle plsql user-defined-types

我有一个类型如下:

CREATE OR REPLACE TYPE tbusiness_inter_item_bag AS OBJECT (
   item_id              NUMBER,
   system_event_cd      VARCHAR2 (20),
   CONSTRUCTOR FUNCTION tbusiness_inter_item_bag RETURN SELF AS RESULT
);
CREATE OR REPLACE TYPE BODY tbusiness_inter_item_bag
AS
   CONSTRUCTOR FUNCTION tbusiness_inter_item_bag RETURN SELF AS RESULT
   AS
   BEGIN
      RETURN;
   END;
END;
Run Code Online (Sandbox Code Playgroud)

当我执行以下脚本时,我得到了一个"未初始化复合参考"错误,这是非常合适的.

DECLARE
   item   tbusiness_inter_item_bag;
BEGIN
   item.system_event_cd := 'ABC';
END;
Run Code Online (Sandbox Code Playgroud)

这也引发了同样的错误:

item.item_id := 3;
Run Code Online (Sandbox Code Playgroud)

但如果我将我的对象类型更改为:

CREATE OR REPLACE TYPE tbusiness_inter_item_bag AS OBJECT (
   item_id              NUMBER(1),
   system_event_cd      VARCHAR2 (20),
   CONSTRUCTOR FUNCTION tbusiness_inter_item_bag RETURN SELF AS RESULT
);
Run Code Online (Sandbox Code Playgroud)

然后最后一个语句不再引发错误(我的"项目"仍然未初始化):

item.item_id := 3;
Run Code Online (Sandbox Code Playgroud)

我不应该得到相同的ORA-06530错误?

ps:Oracle数据库10g企业版10.2.0.4.0版 - 64bi

APC*_*APC 12

我在Oracle 11gR1中重现了相同的行为.我同意你的意见,这对我来说似乎也是一个错误,虽然是一个微不足道的错误.

SQL> CREATE OR REPLACE TYPE tbusiness_inter_item_bag AS OBJECT (
  2     item_id              NUMBER(1),
  3     system_event_cd      VARCHAR2 (20),
  4     CONSTRUCTOR FUNCTION tbusiness_inter_item_bag RETURN SELF AS RESULT
  5  );
  6  /

Type created.

SQL> DECLARE
  2     item   tbusiness_inter_item_bag;
  3  BEGIN
  4     item.item_id := 1;
  5  END;
  6  /

PL/SQL procedure successfully completed.

SQL>
Run Code Online (Sandbox Code Playgroud)

请注意,这仍然失败:

SQL> DECLARE
  2     item   tbusiness_inter_item_bag;
  3  BEGIN
  4     item.item_id := 1;
  5     item.system_event_cd := 'ABC';
  6  END;
  7  /
DECLARE
*
ERROR at line 1:
ORA-06530: Reference to uninitialized composite
ORA-06512: at line 5

SQL>
Run Code Online (Sandbox Code Playgroud)

显然,正确的做法是在引用对象之前始终初始化对象.

SQL> DECLARE
  2     item   tbusiness_inter_item_bag := tbusiness_inter_item_bag();
  3  BEGIN
  4     item.system_event_cd  := 'ABC';
  5  END;
  6  /

PL/SQL procedure successfully completed.

SQL>
Run Code Online (Sandbox Code Playgroud)