Oracle 主体中未定义对象类型规范 SQL
Object type specification not defined in body Oracle SQL
我在尝试开发 PL/SQL
对象时遇到了这个问题。错误信息是这样的:
PLS-00538: subprogram or cursor 'BASE_T' is declared in an
object type specification and must be defined in the object type
body
而我的对象是这样的:
-- Create the first object
CREATE OR REPLACE TYPE base_t IS OBJECT (
oname VARCHAR2 (30),
name VARCHAR2 (30),
CONSTRUCTOR FUNCTION base_t RETURN SELF AS RESULT,
CONSTRUCTOR FUNCTION base_t (oname VARCHAR2, name VARCHAR2) RETURN SELF AS RESULT,
MEMBER FUNCTION get_oname RETURN VARCHAR2,
MEMBER FUNCTION get_name RETURN VARCHAR2,
MEMBER PROCEDURE set_oname (oname VARCHAR2),
MEMBER PROCEDURE to_string
) INSTANTIABLE NOT FINAL;
/
-- Body of the object
CREATE OR REPLACE TYPE BODY base_t AS
CONSTRUCTOR FUNCTION base_t (oname VARCHAR2 , name VARCHAR2 ) RETURN SELF AS RESULT IS BEGIN
SELF.oname := oname;
SELF.name := name;
END;
MEMBER PROCEDURE set_oname (oname VARCHAR2 ) IS BEGIN
SELF.oname := oname;
END set_oname;
MEMBER FUNCTION get_oname RETURN VARCHAR2 IS BEGIN
RETURN SELF.oname;
END get_oname;
MEMBER FUNCTION get_name RETURN VARCHAR2 IS BEGIN
RETURN SELF.name;
END get_name;
MEMBER PROCEDURE to_string IS BEGIN
dbms_output.put_line('Hello ['||self.oname||'].');
END to_string;
END;
/
问题是,通常此错误消息是由不一致的 function/procedure definitions/names 调用的(如此处的 SO 问题所示:Oracle Error PLS-00323: subprogram or cursor is declared in a package specification and must be defined in the package body),但我已经检查过并我不相信我的名字被搞乱了,我的所有定义都是一致的。您还能如何获得该错误消息?
将默认构造函数的一些代码添加到 TYPE BODY 中,例如
SQL> CREATE OR REPLACE TYPE BODY base_t AS
2
3 constructor function base_t return self as result
4 is
5 begin
6 self.oname := null ;
7 self.name := null ;
8 end ;
9
10 CONSTRUCTOR FUNCTION base_t (oname VARCHAR2 , name VARCHAR2 ) RETURN SELF AS RESULT IS BEGIN
11 SELF.oname := oname;
12 SELF.name := name;
13 END;
14 MEMBER PROCEDURE set_oname (oname VARCHAR2 ) IS BEGIN
15 SELF.oname := oname;
16 END set_oname;
17 MEMBER FUNCTION get_oname RETURN VARCHAR2 IS BEGIN
18 RETURN SELF.oname;
19 END get_oname;
20 MEMBER FUNCTION get_name RETURN VARCHAR2 IS BEGIN
21 RETURN SELF.name;
22 END get_name;
23 MEMBER PROCEDURE to_string IS BEGIN
24 dbms_output.put_line('Hello ['||self.oname||'].');
25 END to_string;
26 END;
27 /
Type Body BASE_T compiled
我在尝试开发 PL/SQL
对象时遇到了这个问题。错误信息是这样的:
PLS-00538: subprogram or cursor 'BASE_T' is declared in an
object type specification and must be defined in the object type
body
而我的对象是这样的:
-- Create the first object
CREATE OR REPLACE TYPE base_t IS OBJECT (
oname VARCHAR2 (30),
name VARCHAR2 (30),
CONSTRUCTOR FUNCTION base_t RETURN SELF AS RESULT,
CONSTRUCTOR FUNCTION base_t (oname VARCHAR2, name VARCHAR2) RETURN SELF AS RESULT,
MEMBER FUNCTION get_oname RETURN VARCHAR2,
MEMBER FUNCTION get_name RETURN VARCHAR2,
MEMBER PROCEDURE set_oname (oname VARCHAR2),
MEMBER PROCEDURE to_string
) INSTANTIABLE NOT FINAL;
/
-- Body of the object
CREATE OR REPLACE TYPE BODY base_t AS
CONSTRUCTOR FUNCTION base_t (oname VARCHAR2 , name VARCHAR2 ) RETURN SELF AS RESULT IS BEGIN
SELF.oname := oname;
SELF.name := name;
END;
MEMBER PROCEDURE set_oname (oname VARCHAR2 ) IS BEGIN
SELF.oname := oname;
END set_oname;
MEMBER FUNCTION get_oname RETURN VARCHAR2 IS BEGIN
RETURN SELF.oname;
END get_oname;
MEMBER FUNCTION get_name RETURN VARCHAR2 IS BEGIN
RETURN SELF.name;
END get_name;
MEMBER PROCEDURE to_string IS BEGIN
dbms_output.put_line('Hello ['||self.oname||'].');
END to_string;
END;
/
问题是,通常此错误消息是由不一致的 function/procedure definitions/names 调用的(如此处的 SO 问题所示:Oracle Error PLS-00323: subprogram or cursor is declared in a package specification and must be defined in the package body),但我已经检查过并我不相信我的名字被搞乱了,我的所有定义都是一致的。您还能如何获得该错误消息?
将默认构造函数的一些代码添加到 TYPE BODY 中,例如
SQL> CREATE OR REPLACE TYPE BODY base_t AS
2
3 constructor function base_t return self as result
4 is
5 begin
6 self.oname := null ;
7 self.name := null ;
8 end ;
9
10 CONSTRUCTOR FUNCTION base_t (oname VARCHAR2 , name VARCHAR2 ) RETURN SELF AS RESULT IS BEGIN
11 SELF.oname := oname;
12 SELF.name := name;
13 END;
14 MEMBER PROCEDURE set_oname (oname VARCHAR2 ) IS BEGIN
15 SELF.oname := oname;
16 END set_oname;
17 MEMBER FUNCTION get_oname RETURN VARCHAR2 IS BEGIN
18 RETURN SELF.oname;
19 END get_oname;
20 MEMBER FUNCTION get_name RETURN VARCHAR2 IS BEGIN
21 RETURN SELF.name;
22 END get_name;
23 MEMBER PROCEDURE to_string IS BEGIN
24 dbms_output.put_line('Hello ['||self.oname||'].');
25 END to_string;
26 END;
27 /
Type Body BASE_T compiled