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