7

ファイル名ステートメントで指定されたソケットを介して外部データ ソースに接続するために、OpenVMS で SAS 9.2 を使用しています。

filename extsrc SOCKET "extserver:port" recfm=v;

data foo;
infile extsrc;
input;
.... some statements to read stuff ...;
run;

これは 99% の確率で (当然のことながら) 機能します。ただし、リモート ポートでリッスンしているはずのプログラムがそうでない場合があります。現在、これによりプログラムがエラーで終了します。

Error: Connection refused.

その後、再試行しますが、通常は機能します。しかし、これが面倒なので、プログラムでこのエラーを検出し、そこで処理したいと考えています。SASでこのタイプのエラーを検出する方法を知っている人はいますか?

fileref() 関数を使用して fileref extsrc の有効性を確認しようとしましたが、それは単に -20005 を返します。これは、fileref が割り当てられているが、ローカル ファイルを指していないことを意味します (これは true です)。エラーは、データステップでファイル参照を使用した場合にのみ明らかになるため、次の行に沿って何かをしたいと思います。

data _null_;
rc=infile extsrc;
if rc=0 then do;
  //whatever I want to do;
end;
else do;
  //throw some error and try again later;
end;
run;

[更新 1] 以下の提案を試していますが、真のheisenbug 流に、ここ数日間問題が発生していないため、最終的な解決策はまだわかりません。[/アップデート1]

[更新2] ついにエラーが再び発生しました。cmjohns の回答によると、このエラーが発生した後の syserr の値は 1012 です。ここで syserr の値を監視し、失敗した場合は一定回数再試行します。[/update2]

[update3] 動作するコードを数日間実行しました。追加の問題は、(もちろん) &syserr6 より大きい値を取得するとエラー状態が発生したため、errorabend/noerrorabend設定に応じてプログラムが完全に終了するか、プログラムがobs=0構文チェック モードで続行することでした。どちらも望ましくありません。options noerrorabend nosyntaxcheck解決策は、このエラーを生成するデータステップの前に設定することです。さらに、エラーが発生した場合は、ファイル名 extsrc をクリアして再割り当てする必要があります。最後に、このコードが完成したら、errorabend を復元します。nosyntaxcheck を復元すると、SAS は以前のエラー状態を検出し、その時点で syntaxcheck モードに切り替えますが、これも望ましくありません。[/update3]

4

3 に答える 3

5

&syserr の値をテストしてみましたか。0 以外は、通常、問題があることを示します。

ここで戻り値を確認できます。リストから判断すると、ソケットエラー中に 1012 または 1020 が表示されると思います。

于 2009-04-27T20:58:23.053 に答える
3

これが古いスレッドであることは知っていますが、

SYNTAXCHECK があると便利です。&syserr (実際には &syscc) の問題のために裸で実行する代わりに、コードの機密セクションを過ぎたら、最後に既知の適切な値にクリアすることができます。

以下は、DB2 からのロックされたテーブル エラーを適切に処理する必要があった場合の関連コードです。

/*** temporarily disable ERRORABEND and SYNTAXCHECK ***/
options NOERRORABEND NOSYNTAXCHECK ;

/* save &syscc for laster restoration */
%let presyscc=&syscc;

%do until (...);
  /* do a task, handle some possible errors */
%end;

/* restore &syscc */
%let syscc=&presyscc;

/*** re-enable ERRORABEND and SYNTAXCHECK ***/
options ERRORABEND SYNTAXCHECK ;
于 2009-08-07T19:10:35.253 に答える
3

データ foo をテストできますか? データがない場合は再試行ループを設定できます。データが存在する場合は続行しますか?

何かのようなもの:

再びそれを行う:

(ここにソケットコードを挿入してください)

/*see if ds exists*/

%if not %sysfunc(exist(data.foo)) %then %do ;

/*if the ds does not exist then*/

%put WARNING: The file does not exist! ;

%goto doitagain;

%end;
于 2009-04-28T13:52:28.217 に答える