带你读《SAS数据分析开发之道 软件质量的维度》第三章通信交流3.2系统数字返回码(五)

&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 和整个运行过程中其他相关自动宏变量。

 

上一篇:linux core文件机制


下一篇:阿里云OSS上手指导(上)