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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/3021696/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-10 02:38:37  来源:igfitidea点击:

pl/sql object types "ORA-06530: Reference to uninitialized composite" error

oracleplsqluser-defined-types

提问by mutoss

i have a type as follows:

我有一个类型如下:

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;

when i execute the following script, i got a "Reference to uninitialized composite" error, which is imho quite suitable.

当我执行以下脚本时,出现“引用未初始化复合”错误,恕我直言非常合适。

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

This also raises the same error:

这也引发了同样的错误:

item.item_id := 3;

But if i change my object type into:

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

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

then the last statement raises no more error (where my "item" is still uninitialized):

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

item.item_id := 3;

Shouldn't i get the same ORA-06530 error?

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

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

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

采纳答案by APC

I reproduced the same behaviour in Oracle 11gR1. I would agree with you, this seems like a bug to me too, albeit a trivial one.

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

Note that this still fails:

请注意,这仍然失败:

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>

Obviously, the correct practice is always initialize objects before referencing them.

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

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>

回答by Vincent Malgrat

You need to call the constructor you defined:

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

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

I observe the behaviour you described on a 10.2.0.3 database. I wouldn't rely on it though, it looks like a bug.

我观察到您在 10.2.0.3 数据库中描述的行为。不过,我不会依赖它,它看起来像一个错误。