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