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)