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