是否可以从另一个调用 oracle 对象类型构造函数?
Is it possible to call oracle object type contructor from another one?
如果我创建一个像这样的简单类型:
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。
你应该这样调用
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;
而不是 Java 中的 New
或 super()
,您应该始终使用正确的参数调用 ITEM_REC
。
注。您还应该知道 Oracle 使用表等对象类型进行操作。有关详细信息,请参阅 Tom Kyte "Expert Oracle Database Architecture: Oracle Database 9i, 10g, and 11g Programming Techniques and Solutions"
如果我创建一个像这样的简单类型:
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。
你应该这样调用
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;
而不是 Java 中的 New
或 super()
,您应该始终使用正确的参数调用 ITEM_REC
。
注。您还应该知道 Oracle 使用表等对象类型进行操作。有关详细信息,请参阅 Tom Kyte "Expert Oracle Database Architecture: Oracle Database 9i, 10g, and 11g Programming Techniques and Solutions"