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

时间:2010-06-11 09:34: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;

当我执行以下脚本时,我得到了一个“未初始化复合引用”错误,这是非常合适的。

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数据库10g企业版10.2.0.4.0版 - 64bi

3 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分: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。

答案 2 :(得分:0)

我不认为它的错误。根据文档,您应该初始化复合类型。这将始终有效: SQL> 声明 2 项 tbusiness_inter_item_bag := tbusiness_inter_item_bag(); 3 开始 4 item.system_event_cd := 'ABC'; 5 结束; 6 /

PL/SQL 过程成功完成。

SQL>