PL / SQL调用包外的函数

时间:2012-07-01 15:02:00

标签: oracle plsql

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

如何解决?感谢

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

2 个答案:

答案 0 :(得分: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之外使用,我会把它放在包装内;它使命名空间更加清晰,并避免被错误地用作另一个包/调用等。

答案 1 :(得分:2)

假设logMessagethis帖子中的功能相同:

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

procedure init_data is
    i number;
begin             
    i := logMessage('procedure init_data');
end init_data;