您好我有一份可以90%成功运行的SAS工作。但其中一个步骤依赖于读取一个oracle表,该表偶尔会在我尝试读取它的同时进行更新。我在查询之前实现了检查以查看它是否存在,但是由于拉动需要大约15分钟,它有时会在拉动开始时存在但不会在结束时存在,这会导致SAS错误。
我想要做的是优雅地捕获此错误,睡眠x时间,然后尝试重新运行相同的拉动而不会导致SAS作业失败。有没有办法在SAS中做到这一点?我搜索过的所有东西都依赖于在拉动之前检查前置条件,但是当拉动过程中出现错误导致错误时,我该怎么办?
感谢。
答案 0 :(得分:1)
你可以用不同的方式做到这一点,但我认为老派的方法可能是最好的。
假设您在批处理模式下运行它 - 将您的oracle pull拆分为自己的程序,并使用自己的SAS.exe调用该程序。让它输出一个值(触摸文件,比如说,或者将日期或某些内容写入文件)并让批处理程序查找该文件/值。当更新该文件/值时,批处理程序将移动到该过程的其余部分;如果它没有更新,那么睡觉并重新调用该程序。
如果您在“企业指南”中执行此操作,则会更容易,因为您可以拥有一个或多或少相同的条件(但您可以通过宏变量实际检查错误条件)。但是,您可能不需要将SAS设置为ABEND错误。
答案 1 :(得分:0)
另一种可能值得尝试的方法:如果您的oracle数据库允许您通过SAS锁定表,请尝试在数据步骤之前立即运行lock
语句。然后,您可以通过&SYSLCKRC
自动宏变量检查锁定尝试的结果,等待,然后重试。
E.g。
%macro wait_for_lock(DATASET);
%let MINUTES_WAITED = 0;
%do %until(&SYSLCKRC = 0 or &MINUTES_WAITED > 60);
lock &DATASET;
%if &SYSLCKRC ne 0 %then %do;
data _null_;
sleep = sleep(60);
run;
%end;
%let MINUTES_WAITED = %eval(&MINUTES_WAITED + 1);
%end;
%mend;
%wait_for_lock(oraclelib.mytable);
您还可以使用FILEOCKWAIT系统选项在更新版本的SAS中完成与我过去使用的古代版本相同的操作。