エラーが示唆するよう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
の中に入れます。名前空間をよりクリーンに保ち、別のパッケージ/呼び出しなどで誤って使用されるのを防ぎます。