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 SQL の前) に PROC DELETE ステップを実行することを検討する必要があります。

proc delete data=dw.test_table;
run;

利点は、'proc delete' が存在する場合はテーブルを削除し、テーブルが存在しない場合 (つまり、エラーがない場合) にのみ警告を表示することです。

最後に、PROC SQL セッションをプログラムで制御する場合は、NOERRORSTOP オプションを使用できます。これにより、PROC SQL がエラー後に構文チェック モードに入るのを防ぐことができます。コードは&SQLXRC、各ステップの後に自動マクロ変数を調べて、必要な処理を行うことができます。

これらのヒントが役に立たない場合は、実行しようとしている実際の完全な SAS マクロで質問を修正してください。既存のコードをすべて表示する必要はありません。正確な問題を示すサブセットを表示するだけです。

于 2013-07-06T17:56:02.433 に答える