我在包外定义一个函数,试图调用这个函数,失败了。
如何解决?感谢
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
答案 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)
假设logMessage
与this帖子中的功能相同:
由于logMessage
是一个函数(并返回一个数字),你需要像这样调用它:
procedure init_data is
i number;
begin
i := logMessage('procedure init_data');
end init_data;