pl / sql types d'objets « ORA-06530: Référence à composite non initialisée » erreur
-
26-09-2019 - |
Question
J'ai un type comme suit:
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;
quand j'exécutez le script suivant, je suis une erreur « Référence à composite non initialisée », ce qui est tout à fait approprié IMHO.
DECLARE
item tbusiness_inter_item_bag;
BEGIN
item.system_event_cd := 'ABC';
END;
Cela soulève également la même erreur:
item.item_id := 3;
Mais si je change mon type d'objet dans:
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
);
alors la dernière instruction soulève plus d'erreur (où mon « article » est toujours non initialisée):
item.item_id := 3;
i ne doit pas obtenir la même erreur ORA-06530?
ps: Oracle Database Enterprise Edition de presse 10.2.0.4.0 - 64bi
La solution
Je reproduis le même comportement dans Oracle 11gR1. Je suis d'accord avec vous, cela semble être un bug pour moi aussi, bien que triviale.
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>
Notez que cela ne fonctionne pas encore:
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>
De toute évidence, la pratique correcte est toujours des objets initialize avant de les référencer.
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>
Autres conseils
Vous devez appeler le constructeur que vous avez défini:
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
J'observe le comportement que vous avez décrit sur une base de données 10.2.0.3. Je ne voudrais pas compter sur elle cependant, il ressemble à un bug.