2013-07-06 22 views
0

工作後我用下面的線在宏SAS PIPE不是一個失敗的SQL PROC

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

filename myfh pipe "&perlcommand"; 

執行perlcommand在它正確執行和myfh被分配在第一次迭代。我的PROC SQL失敗後,因爲tabe已經存在,而且這是預期的。

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; 

有人可以幫助我在這裏。謝謝!

+0

/hime/- 是正確的而不是/ home /? – Joe

+0

錯字糾正..但代碼有正確的路徑:) – diham

回答

1

幾點建議:

執行你管命令​​後,加入這種說法清除fileref:

filename myfh clear; 

如果你想每次加載一個新的表,你應該考慮執行PROC立即(前PROC SQL)創建表之前刪除步驟:

proc delete data=dw.test_table; 
run; 

的優點是'PROC刪除」如果存在是否會降表,並只顯示一個娃如果表不存在(即沒有錯誤)。

最後,如果要以編程方式控制PROC SQL會話,可以使用NOERRORSTOP選項。這會阻止PROC SQL在出現錯誤後進入語法檢查模式。您的代碼可以在每個步驟後檢查自動宏變量,並處理事情是必需的。

如果這些提示沒有幫助,請使用您嘗試運行的實際完整的SAS宏修改您的問題。無需顯示所有現有的代碼,只需顯示一個說明您確切問題的子集。

+0

感謝鮑伯的迴應。 1)文件名myfh清除;我正在那樣做。 2)proc刪除,我沒有實現它,並根據要求,如果臨時表已經存在,它應該失敗。我會嘗試其他選項,如果它沒有幫助將更新有NOERRORSTOP的問題 – diham

+0

,有助於解決問題。我將它添加到加載表的pro sql中。鮑勃,任何關於根本原因的想法。 – diham

+1

如果不檢查整個宏,則無法確定「根本原因」。如果使用NOERRORSTOP修復了這個問題,那意味着PROC SQL代碼由於錯誤而停止。它向我表明,宏應該只提交一次「CREATE TABLE」步驟,並且可能在一個「循環」中檢查它是否已經被執行。使用NOERRORSTOP非常有用,但也很危險。如果使用這個宏,宏應該捕獲並處理所有的錯誤。 – BellevueBob