&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”(表示打開該資料集出現故障),則終止該過程。