Tipos de objeto PL/SQL “ORA-06530: referência ao composto não inicializado” Erro
-
26-09-2019 - |
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
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.