&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
cputime 0.07seconds
%putSYSRC:&sysrc;SYSRC:9009
%putSYSCC:&syscc;
SYSCC:0
&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 会话独自锁定该数据集,该代码便会出现故障 :
%letdsid=%sysfunc(open(perm.final,i));
%letvars=%sysfunc(attrn(&dsid,nvars));
WARNING:Argument1tofunctionATTRNreferencedbythe%SYSFUNCor%QSYSFUNCmacrofunctionisoutofrange.
NOTE:Mathematicaloperationscouldnotbeperformedduring%SYSFUNCfunctionexecution.Theresultoftheoperationshavebeensettoamissingvalue.
%letclose=%sysfunc(close(&dsid));
%putVARS:&vars;VARS:
若 OPEN发生故障,&DSID便不会被赋值, 因此,ATTRN函数随后也会发生故障。补救措施是在执行类似 ATTRN或 CLOSE等后续相关动作之前,使用SYSRC函数测试I/O函数的返回码(与OPEN相似),由于I/O函数正常运行时返回的是“0”,因此,以下代码仅在OPEN顺利运行的前提下执行ATTRN:
%macrotest;
%letdsid=%sysfunc(open(perm.final,i));
%if%sysfunc(sysrc())=0%then%do;
%letvars=%sysfunc(attrn(&dsid,nvars));
%letclose=%sysfunc(close(&dsid));
%end;
%else%letvars=FAILURE;
%putVARS:&vars;
%mend;
%test;
实现类似程序控制的另一个方法是在OPEN函数之后立即测试&DSID,如果值是“0”(表示打开该数据集出现故障),则终止该过程。