【问题标题】:Object type specification not defined in body Oracle SQL主体 Oracle SQL 中未定义对象类型规范
【发布时间】:2019-04-26 11:56:48
【问题描述】:

我正在尝试开发的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;
/

问题是,通常这个错误消息是由不一致的函数/过程定义/名称调用的(如这里的这个 SO 问题所示:Oracle Error PLS-00323: subprogram or cursor is declared in a package specification and must be defined in the package body),但我已经检查过了,我不相信我的任何名字搞砸了,我所有的定义都是一致的。你怎么能得到那个错误信息?

【问题讨论】:

  • 你还没有为CONSTRUCTOR FUNCTION base_t RETURN SELF AS RESULT提供一个实现。

标签: sql oracle plsql user-defined-types


【解决方案1】:

在 TYPE BODY 中添加一些默认 ctor 的代码,例如

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

【讨论】:

    猜你喜欢
    • 2022-01-04
    • 2016-01-02
    • 2022-11-12
    • 2018-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-05
    相关资源
    最近更新 更多