PL / SQL对象类型“ORA-06530:参考未初始化的复合材料”错误
-
26-09-2019 - |
题
我有一个类型,如下所示:
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;
当我执行以下脚本,我有一个“引用未初始化的复合材料”错误,这是相当IMHO合适。
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_id := 3;
我不应该得到相同的ORA-06530错误?
PS:Oracle数据库10g企业版发行10.2.0.4.0 - 64bi
解决方案
我再现的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>
其他提示
您需要调用你定义的构造函数:
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。
不隶属于 StackOverflow