2010-06-11 125 views
8

i tienen un tipo como sigue:PL/SQL tipos de objeto "ORA-06530: Referencia al compuesto no inicializado" error

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; 

cuando i ejecutar la siguiente secuencia de comandos, i tiene un "Referencia a compuesto no inicializado" error , lo cual es muy adecuado.

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

Esto también plantea el mismo error:

item.item_id := 3; 

Pero si cambio mi tipo de objeto en:

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

entonces la última declaración no presenta más errores (donde mi "elemento "todavía no está inicializado):

item.item_id := 3; 

¿No debería obtener el mismo error ORA-06530?

ps: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi

Respuesta

9

Reproduje el mismo comportamiento en Oracle 11gR1. Estoy de acuerdo contigo, esto también me parece un error, aunque sea 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> 

Tenga en cuenta que esto falla:

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, la práctica correcta es siempre inicializar objetos antes de referirse a ellos.

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

gracias, eso era lo que esperaba. – mutoss

+0

respuesta exacta, sirve mi propósito. Gracias – Forhad

0

Es necesario llamar al constructor que ha definido:

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 el comportamiento que se describe en un 10,2 .0.3 base de datos. Sin embargo, no confiaría en eso, parece un error.

+1

Vincent, creo que se ha perdido el punto. La asignación a item.item_id tiene éxito o falla dependiendo de si el atributo numérico se define con precisión. Este comportamiento es inconsistente y, por lo tanto, probablemente sea un error. – APC

+0

@APC: sí, me he dado cuenta de que este es el objetivo de la pregunta. Actualicé mi respuesta para reflejar mis observaciones (esto parece un error: no confíe en ello :) –

+0

sí, esto también me pareció un error, solo estaba pensando en advertir a mis colegas que no confíen en él:) Lo publiqué para estar seguro ... – mutoss

Cuestiones relacionadas