1

私のアプリケーションでは、オラクルの手順は現在unixスクリプトを介して呼び出されています.例外ブロックにエラーがある場合、次のような処理をしています:-

PROC_LOGS('<PROC_NAME>', <TABLE_NAME>, 'Exception','Exception occured - '||SQLERRM);

PROC_LOG はエントリをログ テーブルに挿入するだけですが、UNIX でもそのエラーをキャッチする必要があります (0 以外の値を返す) どこから呼び出されたので、残りのプロセスをその上で最適に終了できます。これを行う最善の方法は何ですか? ?

CREATE OR REPLACE....
...
DECLARE
....
BEGIN
..
...
EXCEPTION
WHEN OTHERS THEN
PROC_LOGS('<PROC_NAME>', <TABLE_NAME>, 'EXCEPTION','EXCEPTION OCCURED - '||SQLERRM);
END;

プロシージャを呼び出している Unix スクリプト部分

sqlplus <<-!
$US/$P@$I
set serveroutput on
@$SQL/execute_proc.sql $1 $2

execue_procこのようなものが含まれています:-

 define IN_1 = '&1';
  define IN_2 = '&2';

spool $SQL/test_&&IN
declare
 P_IN_TABLE_NAME varchar2(250) := '&&IN_TABLE_NAME';
 P_IN_REGION varchar2(250) := '&&IN_REGION';
begin
PROC_UPDATE_CHARGE_FACT(P_IN_TABLE_NAME,P_IN_REGION);
    end;

/
spool off
4

3 に答える 3

1

raise次のように、例外が必要です。

EXCEPTION
  WHEN OTHERS THEN
    PROC_LOGS('<PROC_NAME>', <TABLE_NAME>, 'EXCEPTION','EXCEPTION OCCURED - '||SQLERRM);
    RAISE;
END;

または使用RAISE_APPLICATION_ERROR

EXCEPTION
  WHEN OTHERS THEN
    PROC_LOGS('<PROC_NAME>', <TABLE_NAME>, 'EXCEPTION','EXCEPTION OCCURED - '||SQLERRM);
    RAISE_APPLICATION_ERROR (-20002, 'An unexpected exception occurred.');
END;
于 2012-12-18T12:14:34.573 に答える
1

おそらく SQL*Plus を呼び出しており、SQL*Plus には役立つ構成項目があります。

http://docs.oracle.com/cd/E11882_01/server.112/e16604/ch_twelve052.htm#BACHCFEF

おそらく無名ブロックからプロシージャを実行するため、エラーは SQL*Plus に伝搬され、「WHENEVER SQLERROR EXIT SQL.SQLCODE」は関連するエラー コードを UNIX 環境に返します。

于 2012-12-18T12:09:25.050 に答える
0

1 つの方法として、proc_log() でログ ファイルにも書き込み、次に UNIX スクリプトでログ ファイルをチェックする方法があります。

于 2012-12-18T11:37:18.613 に答える