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