Pergunta

Eu tenho um tipo o seguinte:

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;

Quando executo o script a seguir, obtive uma "referência ao erro composto não inicializado", o que é bastante adequado.

DECLARE
   item   tbusiness_inter_item_bag;
BEGIN
   item.system_event_cd := 'ABC';
END;

Isso também levanta o mesmo erro:

item.item_id := 3;

Mas se eu mudar meu tipo de objeto em:

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
);

Então a última declaração não levanta mais erro (onde meu "item" ainda não é não inicializado):

item.item_id := 3;

Eu não deveria obter o mesmo erro ORA-06530?

PS: Oracle Database 10G Enterprise Edition Release 10.2.0.4.0 - 64bi

Foi útil?

Solução

Reproduzi o mesmo comportamento no Oracle 11gr1. Eu concordaria com você, isso parece um bug para mim também, embora trivial.

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>

Observe que isso ainda falha:

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>

Obviamente, a prática correta é sempre inicializar objetos antes de referenciá -los.

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>

Outras dicas

Você precisa ligar para o construtor que você definiu:

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

Observo o comportamento que você descreveu em um banco de dados 10.2.0.3. Eu não confiaria nisso, parece um bug.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top