Oracle SQL Developer не может создать тело пакета - PullRequest
0 голосов
/ 10 января 2012
 CREATE OR REPLACE PACKAGE packet AS
   TYPE tip IS RECORD(a1 INT,a2 VARCHAR2(20));
   FUNCTION getrow return tip;
   PROCEDURE setrow(v tip);
 END packet;
 /
 CREATE OR REPLACE PACKAGE BODY packet AS

   PROCEDURE setrow(v tip) IS
     BEGIN
     dbms_output.put_line('kikkkk');
     END;
  end packet;

Я продолжаю получать: Предупреждение: выполнение завершено с предупреждением

и процедура не может быть вызвана:

* Отчет об ошибке: ORA-04063: тело пакета«IRT.PACKET» содержит ошибки ORA-06508: PL / SQL: не удалось найти вызываемый программный модуль:
«IRT.PACKET» ORA-06512: в строке 7
04063. 00000 - «% s имеет ошибки"
* Причина: попытка выполнить хранимую процедуру или использовать представление с ошибками.Для хранимых процедур проблема может заключаться в синтаксических ошибках или ссылках на другие несуществующие процедуры.Для представлений проблема может быть ссылкой в ​​определяющем запросе представления на несуществующую таблицу.Также может быть таблицей, которая имеет ссылки на несуществующие или недоступные типы.
Действие: Исправьте ошибки и / или создайте ссылочные объекты при необходимости.

Ответы [ 2 ]

3 голосов
/ 10 января 2012

На листе SQL Developer вы можете выполнить этот запрос:

 select * from user_errors

Это даст вам следующие результаты:

NAME    | TYPE         |SEQUENCE |LINE |POSITION |TEXT  ATTRIBUTE                                 |MESSAGE_NUMBER
--------+--------------+---------+-----+---------+------------------------------------------------+--------------
PACKET  | PACKAGE BODY |       1 |   3 |      13 |PLS-00323: subprogram or cursor 'GETROW' is decl| ERROR 323
                                                 |ared in a package specification and must be defi
                                                 |ned in the package body  

Как видите, это облегчаетОткройте для себя Bloomer: вы не определили GETROW в теле пакета.Добавление заглушки, подобной этой, позволит пакету скомпилироваться:

 FUNCTION getrow
     return tip 
 IS
      rv tip;
 BEGIN
      return rv;
 END;
3 голосов
/ 10 января 2012

Вы должны определить функцию GETROW в теле пакета, которое вы объявили в спецификации пакета.

Это позволит вашему пакету скомпилироваться, и тогда вы сможете его вызвать.

Это скомпилировано для меня, когда я добавил GETROW

CREATE OR REPLACE PACKAGE packet
AS
   TYPE tip IS RECORD(
      a1 INT,
      a2 VARCHAR2( 20 )
   );

   FUNCTION getrow
      RETURN tip;

   PROCEDURE setrow( v tip );
END packet;
/

CREATE OR REPLACE PACKAGE BODY packet
AS
   FUNCTION getrow
      RETURN tip
   IS
      v_tip tip;
   BEGIN
      v_tip.a1 := 1;
      v_tip.a2 := 'test';
      RETURN v_tip;
   END;

   PROCEDURE setrow( v tip )
   IS
   BEGIN
      DBMS_OUTPUT.put_line( 'kikkkk' );
   END;
END packet;
...