PL / sql типы объектов "ORA-06530: ссылка на неинициализированный составной" ошибка
у меня есть типа так:
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_id := 3;
не должен ли я получить тот же ORA-06530 ошибка?
ps: Oracle Database 10g Enterprise Edition выпуск 10.2.0.4.0-64bi
2 ответов
я воспроизвел то же поведение в 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. Я бы не стал полагаться на это, хотя это похоже на ошибку.