РТЫ “типов объектов pl/sql 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;

Разве я не должен получать те же РТЫ 06 530 ошибок?

PS: База данных Oracle 10 г Enterprise Edition Выпуск 10.2.0.4.0 - 64bi

13
задан APC 23 June 2017 в 15:49
поделиться

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>
12
ответ дан 2 December 2019 в 00:57
поделиться

Вам нужно вызвать конструктор, который вы определили:

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. Однако я бы не стал на это полагаться, это похоже на ошибку.

0
ответ дан 2 December 2019 в 00:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: