0

我使用下面的行在宏中执行 perlcommand

 %let perlcommand="/home/diham/test.pl read";

 filename myfh pipe "&perlcommand";

在第一次迭代期间,它正确执行并分配了 myfh。之后我的 PROC SQL 失败,因为该表已经存在并且这是预期的。

create table dw.test_table(BULKLOAD=YES BL_DELETE_DATAFILE=YES 
                           BL_OPTIONS='silent=(header,feedback),errors=0'
           BL_SQLLDR_PATH="/opt/app/oracle/product/10.2.0.2/client/bin/sqlldr " )
as select * from dataset;
ERROR: The ORACLE table TEST_TABLE has been opened for OUTPUT. This table already exists, or there is a name conflict with an
   existing object. This table will not be replaced. This engine does not support the REPLACE option.

我的代码中的下一步是再次调用上述宏并运行选择查询。但是这次命令没有被执行。

%macro getCredentials (readwrite, database, acct );

/* Call the perl script and get the credentials */

%let credential = /home/diham/test.pl &readwrite &database  &acct;

/*reading the material-set name and getting the credentials (username and password)*/
data _null_ ;
put "Executing  getCredentials";
run;

LIBNAME DW CLEAR;
filename myfh clear;

filename myfh pipe "&credential";
data CREDS;
length username $ 20 password $ 20;
infile myfh delimiter=',' truncover;
input username $ password $;
run;

filename myfh clear;

data CREDS;
set CREDS;
call symput("username",username);
call symput("password",password);
run;

有人可以在这里帮助我。谢谢!

4

1 回答 1

1

几点建议:

执行管道命令后,通过添加以下语句清除文件引用:

filename myfh clear;

如果你想每次都加载一个新表,你应该考虑在创建表之前立即执行一个 PROC DELETE 步骤(在 PROC SQL 之前):

proc delete data=dw.test_table;
run;

优点是'proc delete' 如果存在则删除该表,并且仅在该表不存在时显示警告说明(即没有错误)。

最后,如果您想以编程方式控制您的 PROC SQL 会话,您可以使用 NOERRORSTOP 选项。这将阻止 PROC SQL 在出错后进入语法检查模式。您的代码可以&SQLXRC在每一步之后检查自动宏变量并处理所需的事情。

如果这些提示没有帮助,请使用您尝试运行的实际、完整的 SAS 宏来修改您的问题。无需显示所有现有代码,只需显示说明您的确切问题的子集。

于 2013-07-06T17:56:02.433 回答