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 に答える