代码之家  ›  专栏  ›  技术社区  ›  Adam McGurk

Oracle SQL正文中未定义对象类型规范

  •  -1
  • Adam McGurk  · 技术社区  · 6 年前

    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 ),但我已经检查过了,我不相信我的名字有任何混乱,我所有的定义都是一致的。您还可以通过其他方式获得该错误消息?

    1 回复  |  直到 6 年前
        1
  •  1
  •   stefan    6 年前

    在类型主体中添加一些默认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