Типы объектов pl / sql Ошибка «ORA-06530: ссылка на неинициализированный композит» - PullRequest
13 голосов
/ 11 июня 2010

У меня есть следующий тип:

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 ]

12 голосов
/ 11 июня 2010

Я воспроизвел такое же поведение в 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>
0 голосов
/ 11 июня 2010

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

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

...