天天看點

帶你讀《SAS資料分析開發之道 軟體品質的次元》第三章通信交流3.2系統數字傳回碼(六)

&SYSRC

&SYSRC自動宏變量能夠記錄與OS 運作環境直接進行互動的程式指令的狀态,如X、SYSEXEC、SYSTASK及 WAITFOR。盡管本書中未詳細介紹, 但 &SYSRC在這些程式指令成功完成之後會顯示一個“0”值。由于&SYSRC在後續X、SYSEXEC、 SYSTASK 或類似程式指令運作之前不能進行重置,而且該宏變量是可讀寫的,是以,在評估之前需要手動重置該變量的值,這一點與 &SYSCC的初始化類似。

以下内容說明的是Windows運作環境中 X 程式指令獲得初步成功,該指令的目的是将目前檔案夾的内容輸入到文本檔案Dir.txt,随後是一個因DOS指令“DIR”錯誤拼寫為“DIRT”而造成的故障:

%letsysrc=0;

%letsyscc=0;data_null_;

x"dir>dir.txt";run;

NOTE:DATAstatementused(Totalprocesstime):realtime   1.66seconds

cputime               0.07seconds

%putSYSRC:&sysrc;SYSRC:0

%putSYSCC:&syscc;

SYSCC:0

data_null_;

x"dirt>dir.txt"

!;

run;

NOTE:DATAstatementused(Totalprocesstime):realtime   0.77seconds

%putSYSRC:&sysrc;SYSRC:9009

&SYSCC傳回碼不受 &SYSRC值的影響,是以,必須通過評估 &SYSRC處理這些程式指令中的異常情況。&SYSRC宏變量在第 12 章“自動化”的“批量異常情況處理”部分講述,它用于異常情況處理架構中顯示 SYSTASK 程式指令的順利運作。

SYSRC()

不要将SYSRC() 函數與&SYSRC自動宏變量混淆,它傳回的是最近運作的輸入/輸出(I/O)函數的完成狀态。由于 I/O函數通常是在%SYSFUNC宏函數中執行的,是以,SYSRC() 值可被儲存為一個宏變量,并且可用于驅動異常情況處理的程式流。

以下代碼及輸出資訊顯示的是 Final資料集中變量的數量 :

%letdsid=%sysfunc(open(perm.final,i));

%letvars=%sysfunc(attrn(&dsid,nvars));

%letclose=%sysfunc(close(&dsid));

%putVARS:&vars;VARS:1

然而,由于 OPEN函數需要 PERM.Final 資料集的共享鎖定,是以,如果某個獨立的使用者或 SAS 會話獨自鎖定該資料集,該代碼便會出現故障 :

WARNING:Argument1tofunctionATTRNreferencedbythe%SYSFUNCor%QSYSFUNCmacrofunctionisoutofrange.

NOTE:Mathematicaloperationscouldnotbeperformedduring%SYSFUNCfunctionexecution.Theresultoftheoperationshavebeensettoamissingvalue.

%putVARS:&vars;VARS:

若 OPEN發生故障,&DSID便不會被指派, 是以,ATTRN函數随後也會發生故障。補救措施是在執行類似 ATTRN或 CLOSE等後續相關動作之前,使用SYSRC函數測試I/O函數的傳回碼(與OPEN相似),由于I/O函數正常運作時傳回的是“0”,是以,以下代碼僅在OPEN順利運作的前提下執行ATTRN:

%macrotest;

%if%sysfunc(sysrc())=0%then%do;

%end;

%else%letvars=FAILURE;

%putVARS:&vars;

%mend; 

%test;

實作類似程式控制的另一個方法是在OPEN函數之後立即測試&DSID,如果值是“0”(表示打開該資料集出現故障),則終止該過程。

繼續閱讀