&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
cputime 0.01seconds
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”:
libnamecurrent"&path";
NOTE:LibrefCURRENTwassuccessfullyassignedasfollows:Engine:V9
PhysicalName:C:\SAS\temp
%putSYSLIBRC:&SYSLIBRC;SYSLIBRC:0
%putSYSCC:&syscc;
SYSCC:0
但是,如果 LIBNAME程序指令错误地引用了&PATCH,而非 &PATH,SAS会产生一个警告,因为它无法解析宏变量 &PATCH。宏变量 &SYSCC会检测并显示这一警告,警告代码显示为“4”。另外,该错误会导致LIBNAME程序指令的运行故障, &SYSLIBRC 的值为负数便反映出程序指令运行故障。
libnamecurrent"&patch";
WARNING:ApparentsymbolicreferencePATCHnotresolved.NOTE:LibraryCURRENTdoesnotexist.
%putSYSLIBRC:&SYSLIBRC;SYSLIBRC:-70008
%putSYSCC:&syscc;
SYSCC:4
从编程方式来讲,可以借助几个方法检测这些故障。例如,可以使用 %SYMEXIST评估宏变量 &PATH,以确定它是否丢失,或者使用 %LENGTH评估 &PATH是否有一个零字符长度。继LIBNAME程序指令之后,还可以验证 &SYSCC的值以避免在出现警告或“运行错误”时,后续代码继续执行。然而,最可靠的方法是在LIBNAME程序指令之后评估&SYSLIBRC,如果值不是“0”,则需终止程序或跳过后续需要引用 CURRENT 文件库的程序。
例如,C:\neverland文件目录在以下代码运行时不存在,&SYSLIBRC的值会显示为负数,反映出异常情况。由于这是一个异常情况,而不是出现了“运行时错误”,因此,&SYSCC依然显示为“0”:
%letsyscc=0;
libnamecurrent "c:\neverland";WARNING:LibraryCURRENTdoesnotexist.
NOTE:LibrefCURRENTwassuccessfullyassignedasfollows:Engine:V9
PhysicalName:c:\neverland
%putSYSCC:&syscc;SYSCC:0
%putSYSLIBRC:&syslibrc;
SYSLIBRC:-70008
在稳健的设计中,&SYSLIBRC值应在 LIBNAME程序指令之后立即进行评估,其他的异常情况处理应该监测&SYSCC 和整个运行过程中其他相关自动宏变量。