PL/SQL对象类型“ORA-06530:未初始化复合引用”错误

16

我有一个如下类型:

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;

当我执行以下脚本时,出现了"引用未初始化的组合体"错误,这在我看来相当合适。

DECLARE
   item   tbusiness_inter_item_bag;
BEGIN
   item.system_event_cd := 'ABC';
END;

这也引发了相同的错误:

item.item_id := 3;

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

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

然后最后一条语句不再引发错误(此时我的“item”仍未初始化):

item.item_id := 3;

我会收到相同的ORA-06530错误吗?

ps:Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64位

3个回答

13

我在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>

请注意,这仍然失败:

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>

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

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>

确切的答案,符合我的目的。谢谢。 - Asraful

0

你需要调用你所定义的构造函数:

SQL> DECLARE
  2     item   tbusiness_inter_item_bag := tbusiness_inter_item_bag();
  3     /*                                 ^^ call the constructor */
  4  BEGIN
  5     item.system_event_cd := 'ABC';
  6  END;
  7  /

PL/SQL procedure successfully completed

我在一个10.2.0.3的数据库上观察到了您描述的行为。不过我不会依赖它,因为它看起来像是一个bug。


1
Vincent,我认为你没有理解重点。item.item_id的赋值成功或失败取决于数值属性是否定义了精度。这种行为是不一致的,因此很可能是一个错误。 - APC
@APC:是的,我已经意识到这是问题的对象。我更新了我的答案以反映我的观察(这看起来像一个错误:不要依赖它:) - Vincent Malgrat
是的,这对我来说也看起来像是一个bug,我正想着在这里警告我的同事不要依赖它 :) 我发帖只是为了确认一下。 - mutoss

0

我认为这不是一个 bug。根据文档,你应该先初始化组合类型。以下方式永远都有效: 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 程序执行成功。

SQL>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接