【问题标题】:SAS Error Handling - Check after a data step to see if error was thrownSAS 错误处理 - 在数据步骤之后检查是否引发错误
【发布时间】:2016-09-02 14:31:19
【问题描述】:

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

我想要做的是优雅地捕获此错误,休眠 x 时间,然后尝试重新运行相同的拉动,而 SAS 作业不会失败。有没有办法在 SAS 中做到这一点?我搜索的所有内容都依赖于在拉取之前检查先决条件,但是如果在拉取期间这些条件发生变化导致错误,我该怎么办?

谢谢。

【问题讨论】:

  • 我不认为你可以真正捕捉到错误(意思是阻止它到达日志),但是一旦错误被抛出,你可以检测到它,休眠,然后再试一次,甚至可能能够重置作业返回代码等。您能否展示如何读取 Oracle 数据(数据步骤或 SQL 步骤等)以及引发什么错误的示例代码?
  • 您的工作进展如何?批?通过 EG 安排?通过 SAS Schedule Manager 计划?

标签: oracle error-handling sas


【解决方案1】:

你可以用很多不同的方式来做这件事,但我认为老派的方法可能是最好的。

假设您在批处理模式下运行此程序 - 将您的 oracle pull 拆分到它自己的程序中,并通过它自己对 SAS.exe 的调用来调用该程序。让它输出一个值(例如,触摸一个文件,或者将日期或其他内容写入文件)并让批处理程序查找该文件/值。当该文件/值被更新时,批处理程序将移动到进程的其余部分;如果未更新,则休眠并重新调用该程序。

如果您在 Enterprise Guide 中执行此操作,则会更容易一些,因为您可以拥有一个或多或少做相同事情的条件(但您实际上可以通过宏变量检查错误条件)。不过,您不需要将 SAS 设置为 ABEND 错误。

【讨论】:

  • 如果您使用 SYSTASK 运行子程序,您可以通过宏变量检索作业状态代码。
  • @data_null_ 好点,虽然我不确定我对 SYSTASK 的了解是否足以在答案中解释这一点。如果您想将其放入您自己的答案中或将其编辑到我的答案中,请随意。
【解决方案2】:

另一种可能值得尝试的方法:如果您的 oracle 数据库允许您通过 SAS 锁定表,请尝试在数据步骤之前立即运行 lock 语句。然后您可以通过&SYSLCKRC自动宏变量检查锁定尝试的结果,等待,然后重试。

例如

%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 中完成同样的事情,而不是我习惯的旧版本。

【讨论】:

  • 别忘了解锁 ;-)
猜你喜欢
  • 2015-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-06
  • 1970-01-01
相关资源
最近更新 更多