我使用 SAS 连接到遇到一些问题的远程 SQL 数据库。它随机阻止连接尝试。现在我们唯一的办法就是重新提交程序,直到建立连接。
我希望 SAS 反复尝试连接到远程服务器,直到成功。如果我可以参数化诸如在重复尝试之间等待和限制尝试次数之类的事情,那就太好了。
请注意,我想在 SAS 中执行此操作,因为我们有程序可以访问远程数据库,在 SAS 中执行一些操作,使用这些结果再次访问远程数据库,等等。
谢谢。
编辑:我正在使用 SAS 9.4 和 Viya。
编辑:该代码非常通用,并且最近才开始。我们经常运行已经运行多年的代码。我们使用SQL数据库的主要方式是通过传递方法。参考下面的链接,失败发生在“连接到oracle ...”,问题出在SQL服务器上。如果您只是等待并再次运行相同的代码,那么在某些情况下它会成功运行。这只是几周前才开始的,但由于某种原因,IT 部门感到不舒服。尽管如此,我们仍然有工作要做,因此我们会等待并重新提交程序,直到建立连接。
我想要围绕“连接到 oracle ...”行的代码重复它,直到连接成功。
https://documentation.sas.com/doc/en/lrcon/9.4/n1kbstf7vw0qcjn1ibfc8c78a9lc.htm
使用 CONNECT 语句创建的自动宏变量。
DBMS 生成的任何返回代码或消息都可以在 语句执行后的SQLXRC和SQLXMSG宏变量。为了 有关这些宏变量的信息,请参阅宏变量 关系数据库。
要真正在 PROC SQL 步骤中间实现循环,您需要使用宏来生成代码。
假设您要生成此 CONNECT 语句。
connect to oracle (user=myusr1 pw=mypwd1 path='mysrv1');
首先创建一个宏,它将重复尝试建立连接。 现在我们只创建一个尝试 10 次并在失败后等待 10 秒的程序。 所以像这样:
%macro connect;
%local n good rc;
%do %until(&good or (&n>10);
%let n=%eval(&n+1);
connect to oracle (user=myusr1 pw=mypwd1 path='mysrv1');
%if (&sqlxrc) %then %do;
%put Try &=n failed. Waiting 10 seconds to retry. ;
%let rc=%sysfunc(sleep(10,1));
%end;
%else %let good=1;
%end;
%mend;
然后在实际代码中调用宏来代替 connect 语句本身。
proc sql;
%connect;
create table want as select * from connection to oracle
( some oracle query here)
;
quit;
您可能还想创建一个指向数据库的 LIBREF。 这可能会更简单,因为您可以使用数据步骤使用 LIBNAME 语句创建 libref,并避免需要创建宏来允许循环。
一旦有了可用的 libref,您就可以使用 PROC SQL 的 CONNECT USING 语法来重新使用为 libref 创建的连接,而不是尝试创建新连接。 例如,如果 libref 名为 MYLIB,那么您的 PROC SQL 步骤将是:
proc sql;
connect using mylib;
create table want as select * from connection to mylib
( some oracle query here)
;
quit;