2016-09-02 33 views
1

こんにちは、私は時間の90%を正常に実行するSASジョブを持っています。しかし、手順の1つは、読んでいるときに同時に更新されているOracleテーブルを読み込むことに依存しています。私はそれを照会する前に最初に存在するかどうかをチェックしましたが、プルには15分かかりますので、プルの開始時に存在することがありますが、終わりではSASエラーになることはありません。SASエラー処理 - エラーがスローされたかどうかを確認するためにデータステップを確認してください

私がやりたいことは、このエラーを正常に捕捉し、x時間スリープしてから、SASジョブが失敗しないで同じプルを再実行しようとしています。 SASでこれを行う方法はありますか?私が検索したすべてのものは、プルの前に事前条件を調べることに頼っていますが、プルの間にエラーにつながるときにそれらを変更することができますか?

ありがとうございました。

+0

本当にエラーを捕まえることはできないと思いますが(ログに到達しないようにする)、エラーがスローされると、それを検出してスリープしてから再試行し、ジョブをリセットすることさえできますリターンコードなどがあります。Oracleデータ(データステップまたはSQLステップなど)をどのように読んでいるか、そしてどのようなエラーがスローされたかのサンプルコードを表示できますか? – Quentin

+0

この仕事はどのように実行していますか?バッチ? EGを通じてスケジュールされていますか? SAS Schedule Managerを通じてスケジュールされていますか? – Joe

答えて

1

これはさまざまな方法で行うことができますが、私は古い学校の方法がおそらく最も良いと思います。

これをバッチ・モードで実行している場合、oracle pullを独自のプログラムに分割し、そのプログラムをSAS.exeへの独自の呼び出しでコールします。 (ファイルに触れる、言いたいこと、ファイルに日付や何かを書く)値を出して、そのファイル/値をバッチプログラムで探すようにしてください。そのファイル/値が更新されると、バッチプログラムは残りのプロセスに移ります。更新されていない場合は、スリープしてそのプログラムを再呼び出ししてください。

エンタープライズガイドでこれを実行している場合は、多かれ少なかれ同じことをする条件を持つことができます(ただし、マクロ変数を使用して実際にエラー状態を確認できます)。ただし、エラー時にSASをABENDに設定する必要はありません。

+1

SYSTASKでサブプログラムを実行すると、マクロ変数を使用してジョブのステータスコードを取得できます。 –

+0

@data_null_答えにそのことを説明するには、SYSTASKについて十分に分かっていませんが、良い点です。それを自分の答えに入れるか、それを私のものに編集したいのであれば、自由に感じてください。 – Joe

0

試行する価値のある方法が1つあります.OracleデータベースでSASを介して表をロックできる場合は、データ・ステップの直前でlock文を実行してみてください。その後、ロック試行の結果を&SYSLCKRC自動マクロ変数経由で確認し、待機してからやり直してください。

など。

%macro wait_for_lock(DATASET); 
    %let MINUTES_WAITED = 0; 
    %do %until(&SYSLCKRC = 0 or &MINUTES_WAITED > 60); 
    lock &DATASET; 
    %if &SYSLCKRC ne 0 %then %do; 
     data _null_; 
     sleep = sleep(60); 
     run; 
    %end; 
    %let MINUTES_WAITED = %eval(&MINUTES_WAITED + 1); 
    %end; 
%mend; 

%wait_for_lock(oraclelib.mytable); 

はまた、私が使用していた古代のものよりもSASの最近のバージョンで同じことを達成するためにFILEOCKWAITシステムオプションを使用することができます。

+0

ロックを解除することを忘れないでください;-) –

関連する問題