SAS错误处理 - 在数据步骤之后检查以查看是否抛出了错误

时间:2016-09-02 14:31:20

标签: oracle error-handling sas

您好我有一份可以90%成功运行的SAS工作。但其中一个步骤依赖于读取一个oracle表,该表偶尔会在我尝试读取它的同时进行更新。我在查询之前实现了检查以查看它是否存在,但是由于拉动需要大约15分钟,它有时会在拉动开始时存在但不会在结束时存在,这会导致SAS错误。

我想要做的是优雅地捕获此错误,睡眠x时间,然后尝试重新运行相同的拉动而不会导致SAS作业失败。有没有办法在SAS中做到这一点?我搜索过的所有东西都依赖于在拉动之前检查前置条件,但是当拉动过程中出现错误导致错误时,我该怎么办?

感谢。

2 个答案:

答案 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中完成与我过去使用的古代版本相同的操作。