2016-03-04 64 views
-1

我有一個名爲table.txt的文件,它存儲了表名。我希望sql更新查詢從我的table.txt文件中逐個獲取表名。我的代碼如下:shell腳本將表名作爲參數傳遞給sqlplus?

while read LINE1; do 
`sqlplus username/[email protected] <<END |sed '/^$/d' 
set head off; 
set feedback off; 
update &LINE1 set enterprise_id = '1234567890' where enterprise_id is NULL; 
update &LINE1 set sim_inventory_id ='1234567890'; 
COMMIT; 
exit; 
END` 
done < table.txt 

它給出一個錯誤sqlplus找不到。你能告訴我什麼是錯的嗎?

+0

爲什麼反引號? SQL \ * Plus是否位於PATH環境變量中,並且已導出? –

+0

@AlexPoole是的,一切都很好,連接。錯誤在傳遞表名。 –

+0

「找不到sqlplus」與傳遞表名無關。它找不到'sqlplus'二進制文件。給出該二進制文件的完整路徑,或者檢查PATH是否已正確設置並導出,無論是在腳本中還是在您調用腳本的shell中。 (如果您將其設置在腳本中,如果刪除反引號,則導出並不是真的必要)。 –

回答

0

這與傳遞表名無關。 「sqlplus not found」錯誤意味着它找不到該二進制可執行文件,所以它沒有嘗試連接或運行SQL命令。

您的shell腳本只能看到來自調用shell的環境變量(如果已導出)。如果您已修改PATH以包含sqlplus二進制文件的位置,那麼您可能尚未導出它;設置後請添加export PATH

或者您可以將腳本設置爲不依賴於shell環境。

export ORACLE_HOME=/path/to/oracle/installation 
export PATH=${ORACLE_HOME}/bin:$PATH 
export LD_LIBRARY_PATH=${ORACLE}/lib:${LD_LIBRARY_PATH} 

while read LINE1; do 
sqlplus username/[email protected] <<END |sed '/^$/d' 
set head off; 
set feedback off; 
update &LINE1 set enterprise_id = '1234567890' where enterprise_id is NULL; 
update &LINE1 set sim_inventory_id ='1234567890'; 
COMMIT; 
exit; 
END 
done < table.txt 

順便說一句,更新同一個表兩次是沒有必要的;你可以這樣做:

update &LINE1 set enterprise_id = nvl(enterprise_id, '1234567890'), 
    sim_inventory_id ='1234567890'; 

這也將是更快地從你的文件內容創建所有的更新語句的列表,並在一個單獨的SQL * Plus會話中運行它們,這樣你就不會反覆創建和撕裂向下連接。但這超出了你所問的範圍。

+0

但是Alex我寫了一個選擇查詢,它正在這個代碼之上工作。但只有這樣會產生一個錯誤:SQL * PLUS ::未找到 –

+0

@vartikadhupar - 反引號創建另一個shell級別。如果你沒有導出PATH(我能說多少次?),那麼它不會被該子shell看到。如果刪除反引號並不能解決問題,那麼編輯該問題以顯示整個腳本(如果該腳本不太長),但至少包括以前的查詢和您設置和/或導出的任何變量的相關位。 –

+0

我得到了問題。它與導出ORACLE路徑無關。當我將查詢綁定到變量時,它會產生結果。感謝您的意見,以及:) –

相關問題