Oracle 类型问题
Oracle Type issue
我正在尝试使用使用 TYPES 的 Oracle TYPES 创建一个 table,但是在编译 "TYPE_USRDTE" 的类型主体时收到此编译警告。
Warning: Type body created with compilation errors
编译错误是:
Compilation errors for TYPE BODY STRACC.TYPE_USRDTE
#13#10Error: PLS-00539: subprogram 'TYPE_USRDTE' is declared in an object type body and must be defined in the object type specification
Line: 2
Text: CONSTRUCTOR FUNCTION TYPE_USRDTE( pUsr varchar2 default user, pDte date default sysdate ) RETURN SELF AS RESULT IS
这里是总代码:
DROP TABLE TAB_MAIN
/
DROP TYPE TYPE_SYSCOL
/
DROP TYPE TYPE_USRDTE
/
DROP SEQUENCE SEQ_GENERIQUE
/
CREATE SEQUENCE SEQ_GENERIQUE NOCACHE
/
CREATE TYPE TYPE_USRDTE AS OBJECT(
USR VARCHAR2(30),
DTE DATE,
CONSTRUCTOR FUNCTION TYPE_USRDTE( pUsr varchar2 default user, pDte date default sysdate ) RETURN SELF AS RESULT
)
/
CREATE TYPE BODY TYPE_USRDTE IS
CONSTRUCTOR FUNCTION TYPE_USRDTE( pUsr varchar2 default user, pDte date default sysdate ) RETURN SELF AS RESULT IS
BEGIN
SELF.USR := pUsr;
SELF.DTE := pDte;
END;
END;
/
CREATE TYPE TYPE_SYSCOL AS OBJECT(
IDT NUMBER ,
CRE TYPE_USRDTE,
MDF TYPE_USRDTE,
CONSTRUCTOR FUNCTION TYPE_SYSCOL(IDT number default -1) RETURN SELF AS RESULT
)
/
CREATE OR REPLACE TYPE BODY TYPE_SYSCOL IS
CONSTRUCTOR FUNCTION TYPE_SYSCOL (IDT number default -1) RETURN SELF AS RESULT IS
BEGIN
SELF.IDT := SEQ_GENERIQUE.NEXTVAL;
SELF.CRE := NEW TYPE_USRDTE(user, sysdate);
SELF.MDF := NEW TYPE_USRDTE(user, sysdate);
RETURN;
end;
END;
/
CREATE TABLE TAB_MAIN ( COLSYS TYPE_SYSCOL, COD VARCHAR2(30) )
/
INSERT INTO TAB_MAIN(COD, COLSYS) VALUES('TESTCOL1', TYPE_SYSCOL())
/
INSERT INTO TAB_MAIN(COD, COLSYS) VALUES('TESTCOL2', TYPE_SYSCOL())
/
INSERT INTO TAB_MAIN(COD, COLSYS) VALUES('TESTCOL3', TYPE_SYSCOL())
/
INSERT INTO TAB_MAIN(COD, COLSYS) VALUES('TESTCOL4', TYPE_SYSCOL())
/
INSERT INTO TAB_MAIN(COD, COLSYS) VALUES('TESTCOL5', TYPE_SYSCOL())
/
COMMIT
/
当我从 TAB_MAIN select 时,我得到了预期的行。谁能帮我理解和纠正这个问题?
这可能是也可能不是真正的问题,但您的正文有一个明显的问题:缺少 RETURN
CREATE TYPE BODY TYPE_USRDTE IS
CONSTRUCTOR FUNCTION TYPE_USRDTE( pUsr varchar2 default user, pDte date default sysdate ) RETURN SELF AS RESULT IS
BEGIN
SELF.USR := pUsr;
SELF.DTE := pDte;
RETURN; -- this is missing in your code
END;
END;
/
干杯!!
以及缺少的 RETURN
,您的定制构造函数与默认构造函数具有相同的参数,这会导致您的 "PLS-00307: too many declarations of 'TYPE_USRDTE' match this call" 错误。当你打电话时:
SELF.CRE := NEW TYPE_USRDTE(user, sysdate);
编译器无法分辨您指的是两个非常相似的构造函数中的哪一个。你必须说清楚你想要什么;这些都将调用您的定制构造函数:
SELF.CRE := NEW TYPE_USRDTE(pUsr => user, pDte => sysdate);
SELF.CRE := NEW TYPE_USRDTE(pusr => user);
SELF.CRE := NEW TYPE_USRDTE(pDte => sysdate);
SELF.CRE := NEW TYPE_USRDTE(user);
SELF.CRE := NEW TYPE_USRDTE(sysdate);
第一个与您的原始调用等效,但指定了参数名称,因此它可以与特定的构造函数匹配。第二个和第三个做同样的事情,但只传递一个参数,允许另一个参数默认。第三个和第四个做同样的事情,但是因为只有定制的构造函数有默认值,所以你不需要参数名;不过,如果您仍然包含它,那就更清楚了。如果您有多个具有相同数据类型的参数,或者它们的提供方式有任何歧义,那么您仍然需要这些名称。
要调用默认构造函数,您可以使用属性名称:
SELF.CRE := NEW TYPE_USRDTE(usr => user, dte => sysdate);
并且始终需要两个参数。
我正在尝试使用使用 TYPES 的 Oracle TYPES 创建一个 table,但是在编译 "TYPE_USRDTE" 的类型主体时收到此编译警告。
Warning: Type body created with compilation errors
编译错误是:
Compilation errors for TYPE BODY STRACC.TYPE_USRDTE
#13#10Error: PLS-00539: subprogram 'TYPE_USRDTE' is declared in an object type body and must be defined in the object type specification
Line: 2
Text: CONSTRUCTOR FUNCTION TYPE_USRDTE( pUsr varchar2 default user, pDte date default sysdate ) RETURN SELF AS RESULT IS
这里是总代码:
DROP TABLE TAB_MAIN
/
DROP TYPE TYPE_SYSCOL
/
DROP TYPE TYPE_USRDTE
/
DROP SEQUENCE SEQ_GENERIQUE
/
CREATE SEQUENCE SEQ_GENERIQUE NOCACHE
/
CREATE TYPE TYPE_USRDTE AS OBJECT(
USR VARCHAR2(30),
DTE DATE,
CONSTRUCTOR FUNCTION TYPE_USRDTE( pUsr varchar2 default user, pDte date default sysdate ) RETURN SELF AS RESULT
)
/
CREATE TYPE BODY TYPE_USRDTE IS
CONSTRUCTOR FUNCTION TYPE_USRDTE( pUsr varchar2 default user, pDte date default sysdate ) RETURN SELF AS RESULT IS
BEGIN
SELF.USR := pUsr;
SELF.DTE := pDte;
END;
END;
/
CREATE TYPE TYPE_SYSCOL AS OBJECT(
IDT NUMBER ,
CRE TYPE_USRDTE,
MDF TYPE_USRDTE,
CONSTRUCTOR FUNCTION TYPE_SYSCOL(IDT number default -1) RETURN SELF AS RESULT
)
/
CREATE OR REPLACE TYPE BODY TYPE_SYSCOL IS
CONSTRUCTOR FUNCTION TYPE_SYSCOL (IDT number default -1) RETURN SELF AS RESULT IS
BEGIN
SELF.IDT := SEQ_GENERIQUE.NEXTVAL;
SELF.CRE := NEW TYPE_USRDTE(user, sysdate);
SELF.MDF := NEW TYPE_USRDTE(user, sysdate);
RETURN;
end;
END;
/
CREATE TABLE TAB_MAIN ( COLSYS TYPE_SYSCOL, COD VARCHAR2(30) )
/
INSERT INTO TAB_MAIN(COD, COLSYS) VALUES('TESTCOL1', TYPE_SYSCOL())
/
INSERT INTO TAB_MAIN(COD, COLSYS) VALUES('TESTCOL2', TYPE_SYSCOL())
/
INSERT INTO TAB_MAIN(COD, COLSYS) VALUES('TESTCOL3', TYPE_SYSCOL())
/
INSERT INTO TAB_MAIN(COD, COLSYS) VALUES('TESTCOL4', TYPE_SYSCOL())
/
INSERT INTO TAB_MAIN(COD, COLSYS) VALUES('TESTCOL5', TYPE_SYSCOL())
/
COMMIT
/
当我从 TAB_MAIN select 时,我得到了预期的行。谁能帮我理解和纠正这个问题?
这可能是也可能不是真正的问题,但您的正文有一个明显的问题:缺少 RETURN
CREATE TYPE BODY TYPE_USRDTE IS
CONSTRUCTOR FUNCTION TYPE_USRDTE( pUsr varchar2 default user, pDte date default sysdate ) RETURN SELF AS RESULT IS
BEGIN
SELF.USR := pUsr;
SELF.DTE := pDte;
RETURN; -- this is missing in your code
END;
END;
/
干杯!!
以及缺少的 RETURN
,您的定制构造函数与默认构造函数具有相同的参数,这会导致您的 "PLS-00307: too many declarations of 'TYPE_USRDTE' match this call" 错误。当你打电话时:
SELF.CRE := NEW TYPE_USRDTE(user, sysdate);
编译器无法分辨您指的是两个非常相似的构造函数中的哪一个。你必须说清楚你想要什么;这些都将调用您的定制构造函数:
SELF.CRE := NEW TYPE_USRDTE(pUsr => user, pDte => sysdate);
SELF.CRE := NEW TYPE_USRDTE(pusr => user);
SELF.CRE := NEW TYPE_USRDTE(pDte => sysdate);
SELF.CRE := NEW TYPE_USRDTE(user);
SELF.CRE := NEW TYPE_USRDTE(sysdate);
第一个与您的原始调用等效,但指定了参数名称,因此它可以与特定的构造函数匹配。第二个和第三个做同样的事情,但只传递一个参数,允许另一个参数默认。第三个和第四个做同样的事情,但是因为只有定制的构造函数有默认值,所以你不需要参数名;不过,如果您仍然包含它,那就更清楚了。如果您有多个具有相同数据类型的参数,或者它们的提供方式有任何歧义,那么您仍然需要这些名称。
要调用默认构造函数,您可以使用属性名称:
SELF.CRE := NEW TYPE_USRDTE(usr => user, dte => sysdate);
并且始终需要两个参数。