Search code examples
oracle-databaseplsqluser-defined-types

pl/sql object types "ORA-06530: Reference to uninitialized composite" error


i have a type as follows:

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;

when i execute the following script, i got a "Reference to uninitialized composite" error, which is imho quite suitable.

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

This also raises the same error:

item.item_id := 3;

But if i change my object type into:

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

then the last statement raises no more error (where my "item" is still uninitialized):

item.item_id := 3;

Shouldn't i get the same ORA-06530 error?

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


Solution

  • I reproduced the same behaviour in Oracle 11gR1. I would agree with you, this seems like a bug to me too, albeit a trivial one.

    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>
    

    Note that this still fails:

    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>
    

    Obviously, the correct practice is always initialize objects before referencing them.

    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>