0

我在包外定义了一个函数,试图调用这个函数,失败了。

如何解决?谢谢

create or replace
package body test_erp AS    
    procedure init_data is
    begin             
        logMessage('procedure init_data');
    end init_data;        
end test_erp;
/

show error

错误是

PLS-00221: 'LOGMESSAGE' is not a procedure or is undefined
4

2 回答 2

3

正如错误所暗示logmessage的,这不是一个程序。这是一个功能。当函数返回一些东西时,你需要将它分配给一个变量。你知道它logmessage返回一个数字,所以你需要声明一个变量来放入这个返回值。

create or replace package body test_erp AS    
    procedure init_data is

    l_success number;

    begin        

        l_message := logMessage('procedure init_data');
        dbms_output.put_line(to_char(l_success));

    end init_data;        

end test_erp;
/

但是,看起来实际上应该是一个程序logmessage 我假设您正在执行 DML 语句(更新/插入)。除非是这种情况,否则在语句中使用函数调用select,这意味着总是有可能发生错误。如果logmessage是一个过程,您可以声明一个out参数来告诉调用过程是否一切正常;类似于以下内容:

create or replace procedure logmessage( msg in varchar2, success out number) is

begin

   insert into logs values(msg);
   success := 1;
exception when others then
   success := 0;
end logmessage;

然后,您可以按如下方式调用它:

create or replace package body test_erp AS    
   procedure init_data is

       l_success number;

   begin        

      logMessage('procedure init_data', l_success);
      dbms_output.put_line(to_char(l_success));

   end init_data;        
end test_erp;
/

如果logmessage不打算在包装外使用,test_erp我会把它放在包装内;它使命名空间保持清洁并避免它被错误地用作另一个包/调用等。

于 2012-07-01T15:09:42.690 回答
2

假设这logMessage是与这篇文章相同的功能:

由于logMessage是一个函数(并返回一个数字),因此您需要像这样调用它:

procedure init_data is
    i number;
begin             
    i := logMessage('procedure init_data');
end init_data; 
于 2012-07-01T15:09:53.110 回答