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

Posted

技术标签:

【中文标题】是否可以从另一个调用 oracle 对象类型构造函数?【英文标题】:Is it possible to call oracle object type contructor from another one? 【发布时间】:2016-07-25 13:30:31 【问题描述】:

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

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;

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

顺便说一句,我使用的是 Oracle 12C。

【问题讨论】:

您是否也使用大写锁定编写您的 Java 代码? @William Robertson No. 【参考方案1】:

你应该这样打电话

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;

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

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

【讨论】:

以上是关于是否可以从另一个调用 oracle 对象类型构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

C/C++编程笔记:高级C++知识 |虚拟副本构造器

在java中从另一个调用一个构造函数[重复]

在破坏调用期间从另一个线程未定义的行为调用对象上的方法?

如何在 Java 中从另一个构造函数调用一个构造函数?

如何从另一个构造函数调用 C++ 类构造函数 [重复]

C# - 在一些计算后从另一个构造函数调用构造函数[重复]