2015-10-09 34 views
0

使用sql loader,我知道我可以在我的ctl文件中引用一個ksh變量。例如,我可以寫把選擇結果放入一個ksh變量

LOAD DATA 
    INFILE '$PATH_IN_KSH/my_file.dat' 
... 

我想補充一個WHEN子句這樣

WHEN (125:125) = '$P_NUMBER' 

P_NUMBER將有一列在表中的值,我會用一個選擇查詢檢索。

有沒有可能這樣做?使用select從列中檢索值,並以某種方式將其放入ksh變量,以便ctl文件可以看到它。 (一些與SQL加?)

謝謝

+0

[This](http://stackoverflow.com/a/17731960/266304)稍微複雜一些 - 你並不需要一個函數,但它不會傷害到分離。這是否給你你需要的東西? –

+0

編寫一個shell腳本來驅動這個過程。在腳本中使用一個HERE DOC作爲sqlldr控制文件和引用shell變量,或者將控制文件作爲單獨的模板文件運行sed以用值替換變量。 – TenG

+0

@Alex Poole ..是的,它似乎很好 – mlwacosmos

回答

0

作爲一個基本的輪廓,你可以運行在SQL * Plus與定界符進行查詢,輸出分配給一個變量:

P_NUMBER=`sqlplus -s /nolog <<!EOF 
connect username/password 
whenever sqlerror exit failure 
set pagesize 0 
set feedback off 
select your_value from your_table where your_key = 'something'; 
exit 0 
!EOF` 

用反引號括起來將結果賦給變量。 $ P_NUMBER然後將保存你的查詢得到的任何值(或者如果證書錯誤,說一個錯誤消息)。如果您確定查詢只返回一個結果,它會有所幫助。在嘗試使用變量之前,您還可以使用$?測試返回代碼以查找錯誤。

包括-s標誌,關閉反饋和設置頁面大小爲零共同抑制所有的噪音,所以你只得到了結果,並沒有剝離出橫幅,標題等

最後我我使用了/nolog,並將connect語句放在heredoc中,以便憑證不會出現在進程列表中,這是一個經常被忽略的安全問題。如果您不想這樣做並且將憑據設置爲sqlplus username/passwd,則可以添加-l標誌,以便它只嘗試登錄一次;否則,如果由於某種原因登錄失敗,它會嘗試使用heredoc的其餘部分作爲進一步的憑據,並且可能會看起來掛起短腳本。