Oracle SQL Developer无法创建包体

时间:2012-01-10 10:30:26

标签: sql oracle plsql oracle-sqldeveloper

 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 个答案:

答案 0 :(得分:3)

您必须在包规范中声明的包体中定义函数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;

答案 1 :(得分:3)

在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;