是否可以从另一个调用oracle对象类型的构造函数?

时间:2016-07-25 13:30:32

标签: oracle plsql oracle12c

如果我创建一个这样的简单类型:

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

然后我使用如下构造函数,一切都完美无缺:

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

但是,在第二个构造函数中,我想调用第一个构造函数,就像我们在java中一样;它应该像

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

        RETURN;
    END;

但这不起作用。这是因为它根本不可能,或者因为我使用了错误的语法?我已经尝试了几种(不成功的)语法......

BTW,我正在使用Oracle 12C。

1 个答案:

答案 0 :(得分:2)

你应该这样打电话

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;

您应该始终使用正确的参数调用New,而不是使用Java中的super()ITEM_REC

注意即可。此外,您应该知道Oracle使用表格等对象类型进行操作。有关更多信息,请参阅Tom Kyte“专家Oracle数据库架构:Oracle数据库9i,10g和11g编程技术和解决方案”