&SYSLCKRC
自動宏變量 &SYSLCKRC能顯示最近 LOCK程式指令的順利運作,LOCK程式指令以往用于顯示資料集未被使用,僅能通過某個程式打開。由于 LOCK 程式指令在 BaseSAS軟體中的顯示缺乏完整性,且通常會生成無效的結果,是以,LOCK程式指令及&SYSLCKRC應該隻能用在SAS/SHARE環境中,但僅用于說明遺留的 SAS代碼。“互斥和信号量”部分會介紹一個替代 LOCK功能的方法。
以下内容顯示的是 LOCK程式指令的傳統用法——擷取PERM.Final資料集上的排他檔案鎖定,進而使其他程式或使用者(理論上)無法擷取該資料集 :
dataperm.final;
lengthchar$10;run;
NOTE:ThedatasetPERM.FINALhas1observationsand1variables.NOTE:DATAstatementused(Totalprocesstime):
realtime 0.01seconds
cputime 0.01seconds
lockperm.final;
NOTE:PERM.FINAL.DATAisnowlockedforexclusiveaccessbyyou.
%macrotest;
%if&SYSLCKRC=0%then%do;
procsortdata=perm.final;
bychar;run;
%end;
lockPERM.finalclear;
%mend;
%test;
NOTE:Therewere1observationsreadfromthedatasetPERM.FINAL.NOTE:ThedatasetPERM.FINALhas1observationsand1variables.NOTE:PROCEDURESORTused(Totalprocesstime):
realtime 0.14seconds
NOTE:PERM.FINAL.DATAisnolongerlockedbyyou.
在許多情況下,LOCK 程式指令确實能夠成功地鎖定引用的資料集,阻止其他使用者或 SAS會話擷取該資料集。然而,在某些情況下,即便資料集被另一個SAS會話獨家鎖定,但 LOCK 程式指令也會産生一個值為“0”的&SYSLCKRC。假設出現不一緻的情況,則不推薦使用LOCK 程式指令。
&SYSLIBRC
自動宏變量 &SYSLIBRC顯示的是最近的 LIBNAME程式指令的成敗,如果LIBNAME指派一個有效的檔案庫,則&SYSLIBRC顯示為“0”。LIBNAME的一個動态用途是為運作的 SAS程式的邏輯位置指定一個檔案庫。例如,如果 SAS程式 C:\SAS\temp\test.sas在 SAS 顯示管理系統中運作,那麼開發人員可能希望将 SAS檔案庫CURRENT 指派到 C:\SAS\temp :
*mustbesavedtoanamedSASprogramtoexecute;
%letsyscc=0;
%letpath=%sysget(SAS_EXECFILEPATH);
%letpath=%substr(&path,1,%length(&path)-%length(%scan(&path,-1,\)));
libnamecurrent"&path";
%putSYSLIBRC:&SYSLIBRC;
%putSYSCC:&syscc;
以下代碼使用的是CURRENT檔案庫,由于LIBNAME程式指令運作正确,是以,&SYSLIBRC的值設定為“0”:
NOTE:LibrefCURRENTwassuccessfullyassignedasfollows:Engine:V9
PhysicalName:C:\SAS\temp
%putSYSLIBRC:&SYSLIBRC;SYSLIBRC:0
SYSCC:0
但是,如果 LIBNAME程式指令錯誤地引用了&PATCH,而非 &PATH,SAS會産生一個警告,因為它無法解析宏變量 &PATCH。宏變量 &SYSCC會檢測并顯示這一警告,警告代碼顯示為“4”。另外,該錯誤會導緻LIBNAME程式指令的運作故障, &SYSLIBRC 的值為負數便反映出程式指令運作故障。
libnamecurrent"&patch";
WARNING:ApparentsymbolicreferencePATCHnotresolved.NOTE:LibraryCURRENTdoesnotexist.
%putSYSLIBRC:&SYSLIBRC;SYSLIBRC:-70008
SYSCC:4
從程式設計方式來講,可以借助幾個方法檢測這些故障。例如,可以使用 %SYMEXIST評估宏變量 &PATH,以确定它是否丢失,或者使用 %LENGTH評估 &PATH是否有一個零字元長度。繼LIBNAME程式指令之後,還可以驗證 &SYSCC的值以避免在出現警告或“運作錯誤”時,後續代碼繼續執行。然而,最可靠的方法是在LIBNAME程式指令之後評估&SYSLIBRC,如果值不是“0”,則需終止程式或跳過後續需要引用 CURRENT 檔案庫的程式。
例如,C:\neverland檔案目錄在以下代碼運作時不存在,&SYSLIBRC的值會顯示為負數,反映出異常情況。由于這是一個異常情況,而不是出現了“運作時錯誤”,是以,&SYSCC依然顯示為“0”:
libnamecurrent "c:\neverland";WARNING:LibraryCURRENTdoesnotexist.
PhysicalName:c:\neverland
%putSYSCC:&syscc;SYSCC:0
%putSYSLIBRC:&syslibrc;
SYSLIBRC:-70008
在穩健的設計中,&SYSLIBRC值應在 LIBNAME程式指令之後立即進行評估,其他的異常情況處理應該監測&SYSCC 和整個運作過程中其他相關自動宏變量。