2014-05-21 57 views
0

shell腳本,SQL文件,我已經開發了下面的代碼從shell腳本調用SQL文件testshell.sh調用從參數

#!/usr/bin/env ksh 
feed=`sqlplus -s uname/pwd <<-EOF 
@test.sql 'Test_VAl' 
/
exit; 
EOF` 
echo $feed; 

我的SQL文件是test.sql其中包含以下內容:

Declare 

attributeName varchar2(255):=&1; 
BEGIN 
    DBMS_OUTPUT.put_line (attributeName); 

END; 

我在執行時遇到錯誤。

old 3: attributeName varchar2(255):=&1; 
new 3: attributeName varchar2(255):=Test_VAl; 
attributeName varchar2(255):=Test_VAl; test.sql testshell.sh 
ERROR at line 3: 
ORA-06550: line 3, column 31: PLS-00201: identifier 'TEST_VAL' must be declared 
ORA-06550: line 3, column 16: PL/SQL: Item ignored 
ORA-06550: line 5, column 25: PLS-00320: the declaration of the type of this expression is incomplete or malformed 
ORA-06550: line 5, column 3: PL/SQL: Statement ignored 

請告訴我如何解決此問題。

回答

2

如果您的替代變量是一個字符串,那麼您需要在使用它時引用它,而不是在傳入時引用它。此刻它沒有引號,因此它被視爲對象標識符,並且沒有匹配的對象或變量,因此錯誤。

所以,你的SQL腳本是:

set verify off 
DECLARE 
    attributeName varchar2(255):='&1'; 
BEGIN 
    DBMS_OUTPUT.put_line (attributeName); 
END; 
/

當然,你並不需要定義一個局部變量,但我假設你用簡單的情況下經歷過了,現在。

set verify off停止顯示oldnew消息。這對於調試很有用,否則通常只是噪聲。

然後你可以把它叫做:

feed=`sqlplus -s uname/pwd <<-EOF 
@test.sql Test_VAl 
exit; 
EOF` 

或者如果包括exit的腳本,你可以這樣做:

feed=`sqlplus -s uname/pwd @test.sql Test_VAl` 
+0

感謝亞歷克斯。 這是問題所在。我在sqldeveloper中嘗試了相同的代碼,它工作正常,這讓我相信sql部分是正確的。 –