pl / sql types d'objets « ORA-06530: Référence à composite non initialisée » erreur

StackOverflow https://stackoverflow.com/questions/3021696

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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top