1

シェルスクリプトから、killコマンドを使用してバックグラウンド関数プロセスを強制終了しています。この関数は、sqlplusを使用してSQLプロシージャを呼び出します。

func_foo(){
retval=`sqlplus -s $USER_NAME/$PWD <<EOF
        set pages 0 lines 120 trimout on trimspool on tab off echo off verify off feed off serverout on
        exec pkg_xyz.proc_abc();
        exit;
        EOF`
}


func_foo&
pid_func_foo=$!

sleep 5

kill $pid_func_foo 2>/dev/null
wait $pid_func_foo 2>/dev/null

このアプローチの問題は、関数プロセスが強制終了されても、Oracleプロセスが実行され続けることです。Oracleプロセスは強制終了されていません。私はオラクルを初めて使用します。このシナリオの処理方法がわかりません。このシナリオの処理方法に関するヒントを教えてください。

4

2 に答える 2

2

Oracleプロセスを強制終了することは悪い考えです。別の方法で問題を解決してみてください。

  1. dbms_schedulerを使用して、プロシージャをジョブとして実行します。dbms_scheduler.stop_job('job name')を呼び出すことにより、必要に応じてジョブを停止できます。

  2. プログラムで停止できるように手順を作成します。私は非常に長い間実行されるいくつかのプロシージャを構築しました。時々、プロシージャは「ステータス」と呼ばれる、1行のみを含むテーブルをチェックします。ステータスが「ok」の場合、実行されます。行を別の行に変更すると、プロシージャはこれを確認して停止します。

于 2013-01-20T07:36:38.270 に答える
0

インタラクティブな SQL*Plus セッションでヒットcontrol-cすると、実行中のコマンドが終了し、情報を提供する ORA-01013 メッセージが生成され、SQL*Plus プロンプトが表示されたままになります。Oracle プロセスはまだアクティブですが、アイドル状態です (単純化しすぎている可能性があります)。

デフォルトの終了シグナルではなく、割り込みシグナルを送信することで、同等の効果を得ることができます。これは、OS とシェルによって若干異なる場合がありますが、通常は次のようになります。

kill -int $pid_func_foo 2>/dev/null

これでも ORA-01013 が生成され、sqlplusプロセスは続行されます。ただし、「ヒアドキュメント」の次のステートメントはexit停止し、終了シグナルよりも自然に停止し、Oracle セッションは正常にクリアされ、Oracle プロセスが削除されます。(プロシージャが挿入または更新を実行している場合、トランザクションがロールバックする間に遅延が発生する可能性があります)。

これが実行時間の制限を管理するのに特に良い方法かどうかはわかりません。ジョブ制御またはリソース管理がより良い方法かもしれません。

于 2013-01-21T15:15:13.397 に答える