Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to call oracle object type contructor from another one?

If I create a simple type like this:

CREATE OR REPLACE TYPE ITEM_REC AS OBJECT (
    FIELD1 NUMBER(1)
  , FIELD2 VARCHAR2(15 CHAR)
  , FIELD3 NUMBER
  , FIELD4 DATE
  , CONSTRUCTOR FUNCTION ITEM_REC(
        FIELD1 NUMBER
      , FIELD2 VARCHAR2
    ) RETURN SELF AS RESULT
  , CONSTRUCTOR FUNCTION ITEM_REC(
        FIELD1 NUMBER
      , FIELD2 VARCHAR2
      , FIELD3 NUMBER
    ) RETURN SELF AS RESULT
);
/

And then I use the constructors as below, all works perfectly:

CREATE OR REPLACE TYPE BODY ITEM_REC AS
    CONSTRUCTOR FUNCTION ITEM_REC(
        FIELD1 NUMBER
      , FIELD2 VARCHAR2
    ) RETURN SELF AS RESULT IS
    BEGIN
        SELF.FIELD1 := FIELD1;
        SELF.FIELD2 := FIELD2;

        RETURN;
    END;

    CONSTRUCTOR FUNCTION ITEM_REC(
        FIELD1 NUMBER
      , FIELD2 VARCHAR2
      , FIELD3 NUMBER
        ) RETURN SELF AS RESULT IS
    BEGIN
        SELF.FIELD1 := FIELD1;
        SELF.FIELD2 := FIELD2;
        SELF.FIELD3 := FIELD3;

        RETURN;
    END;
END;
/

However, on the second constructor, I would like to invoke first constructor, the same way we do in java; it should be something like

    CONSTRUCTOR FUNCTION ITEM_REC(
        FIELD1 NUMBER
      , FIELD2 VARCHAR2
      , FIELD3 NUMBER
        ) RETURN SELF AS RESULT IS
    BEGIN
        SELF(FIELD1, FIELD2);
        SELF.FIELD3 := FIELD3;

        RETURN;
    END;

But this doesn't work. This is because it is not possible at all or because I'm using the wrong syntax? I tried several (unsuccessful) syntaxes already...

BTW, I'm using Oracle 12C.

like image 357
Cássio Avatar asked Sep 03 '25 06:09

Cássio


1 Answers

You should call like this

create or replace TYPE BODY       ITEM_REC AS
    CONSTRUCTOR FUNCTION ITEM_REC(
        FIELD1 NUMBER
      , FIELD2 VARCHAR2
    ) RETURN SELF AS RESULT IS
    BEGIN
        SELF.FIELD1 := FIELD1;
        SELF.FIELD2 := FIELD2;

        RETURN;
    END;

    CONSTRUCTOR FUNCTION ITEM_REC(
        FIELD1 NUMBER
      , FIELD2 VARCHAR2
      , FIELD3 NUMBER
        ) RETURN SELF AS RESULT IS
    BEGIN
        SELF := ITEM_REC(FIELD1, FIELD2);
        SELF.FIELD3 := FIELD3;

        RETURN;
    END;
END;

Instead of New or super() in Java you should always call ITEM_REC with correct parameters.

Note. Also you should know that Oracle manipulates with object types like tables. For more information see Tom Kyte "Expert Oracle Database Architecture: Oracle Database 9i, 10g, and 11g Programming Techniques and Solutions"

like image 56
Evgeniy K. Avatar answered Sep 05 '25 01:09

Evgeniy K.