Спецификация типа объекта не определена в теле Oracle SQL - PullRequest
0 голосов
/ 24 ноября 2018

У меня проблема с 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: подпрограмма или курсор объявлены в спецификации пакета и должны быть определены в теле пакета ), но я проверил черези я не верю, что любое из моих имен испорчено, и все мои определения согласуются.Как еще вы можете получить это сообщение об ошибке?

1 Ответ

0 голосов
/ 24 ноября 2018

Добавьте некоторый код для ctor по умолчанию в 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
...