pl / sql tipi di oggetti “ORA-06530: riferimento a inizializzata composito” Errore
-
26-09-2019 - |
Domanda
ho un tipo come segue:
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 eseguo il seguente script, ho ottenuto un "riferimento per inizializzata composito" l'errore, che è imho abbastanza adatto.
DECLARE
item tbusiness_inter_item_bag;
BEGIN
item.system_event_cd := 'ABC';
END;
Ciò solleva anche lo stesso errore:
item.item_id := 3;
Ma se cambio il mio tipo di oggetto in:
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
);
quindi l'ultima affermazione non solleva più di errore (dove la mia "voce" è ancora inizializzata):
item.item_id := 3;
Non dovrei ottenere lo stesso errore ORA-06530?
ps: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
Soluzione
ho riprodotto lo stesso comportamento in Oracle 11gR1. Sono d'accordo con te, questo mi sembra un bug anche a me, anche se molto banale.
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>
Si noti che questo non riesce ancora:
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>
Ovviamente, la pratica corretta è sempre di inizializzazione degli oggetti prima di loro riferimento.
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>
Altri suggerimenti
È necessario chiamare il costruttore si è definito:
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
I osservare il comportamento che lei ha descritto su un database 10.2.0.3. Non vorrei contare su di esso, però, sembra come un insetto.