2011-03-03 65 views
1

由於所有結果都是在空白區而不是實際列值上拆分的,因此在將列值存儲到shell腳本變量時遇到問題。將CHAR或CLOB sqlplus列存儲到shell腳本變量中

例如,這是我現在得到:

set -A SQL_RESULTS_ARRAY `sqlplus -s un/[email protected] << EOF 
SET ECHO OFF 
SET FEED OFF 
SET HEAD OFF 
SET SPACE 0 
SELECT EMAIL_SUBJECT, MAIL_TO FROM EMAIL_TABLE; 
EOF` 

echo "${SQL_RESULTS_ARRAY[0]}" 
echo "${SQL_RESULTS_ARRAY[1]}" 

這不起作用,因爲EMAIL_SUBJECT的價值是整個句子,即「信息學科測驗」,所以那些回聲剛剛結束了印刷

Message 
subject 

而不是

Message subject test 
[email protected] [email protected] 

基本上,我該怎麼收場,只有兩個項目我數組(每列一個),而不是五個項目(每個單詞一個)?這是否可能只有一個連接? (我寧可不開始每列新的連接)

編輯:另一件事,另一個我的CLOB列是EMAIL_BODY,它可以基本上是任何文本 - 因此我寧願沒有預設分隔符,因爲EMAIL_BODY可以有各種逗號,管道,新線等......

回答

0

您可以嘗試設置COLSEP並按其值分開。

+0

我該如何區分它們?我在數據庫中將EMAIL_SUBJECT的值更改爲「郵件主題測試」,並執行了「SET COLSEP」,但它不起作用(但這可能不是您的意思) – beans 2011-03-03 21:26:10

+0

我也將查詢更改爲SELECT EMAIL_SUBJECT ,(SELECT','FROM DUAL),MAIL_TO FROM EMAIL_TABLE;'與SET COLSEP'一起使用,都不起作用 – beans 2011-03-03 21:26:31

+0

@beans:你可以參考任何sqlplus引用(只需要搜索** sqlplus set colsep * *)。 **設置colsep **的參數是要在列之間輸出的字符串。你可以像這樣設置它:** set colsep'---'**,看看會發生什麼。對不起,沒有sqlplus方便,所以不會提供一個完整的解決方案,但是一旦你爲你的環境選擇了一個唯一的字符串,你就可以將之前和之後的字符串分開。 – 2011-03-03 21:41:02

0

嘗試在select語句中使用字符串連接添加雙引號。引用的數組元素允許使用空格(至少在bash中)。

+0

將查詢更改爲 'SELECT'''|| || EMAIL_SUBJECT ||'''''''|| MAIL_TO ||'「'FROM EMAIL_TABLE;' 仍然產生了以下結果: 'SQL_RESULTS_ARRAY [0] =(」消息) SQL_RESULTS_ARRAY [1] =(被攝體) SQL_RESULTS_ARRAY [2] =(試驗 「) SQL_RESULTS_ARRAY [3] =(」 [email protected]) SQL_RESULTS_ARRAY [4] =(EMAIL2 @電子郵件。com「)' – beans 2011-03-03 21:32:20

+0

如果glenn的建議沒有解決問題,我認爲sqlplus只是填充數組不正確,總是在不同的字段中。是否可以選擇將sqlplus腳本的輸出傳遞給」cut「或」awk '? – Bernhard 2011-03-03 21:58:07

2

缺少的關鍵是將shell的IFS(內部字段分隔符)設置爲與查詢結果相同。這裏有一個KSH會話:

$ results="Message subject test,[email protected] [email protected]" 
$ set -A ary $results 
$ for i in 0 1 2 3 4; do print "$i. ${ary[$i]}"; done 
0. Message 
1. subject 
2. test,[email protected] 
3. [email protected] 
4. 
$ IFS=, 
$ set -A ary $results 
$ for i in 0 1 2 3 4; do print "$i. ${ary[$i]}"; done 
0. Message subject test 
1. [email protected] [email protected] 
2. 
3. 
4. 

你可能會想要做這樣的事情:

results=`sqlplus ...` 
old_IFS="$IFS" 
IFS=, 
set -A SQL_RESULTS_ARRAY $results 
IFS="$old_IFS 
print "${SQL_RESULTS_ARRAY[0]}" 
print "${SQL_RESULTS_ARRAY[1]}" 
+0

在我的小例子中,這實際上是完美的,但我真正的表格中的其他列中的一個是EMAIL_BODY,這會產生挑選角色的巨大風險,在不會意外地分割EMAIL_BODY的情況下,如果有人決定添加(或者我選擇的任何角色)進入它...以後感謝...(我會投票,但我沒有足夠的代表:() – beans 2011-03-03 22:02:42

+0

@beans:可能在這種情況下,你應該選擇一個字段,然後從雙重字段中選擇一個分隔符字符串,然後選擇下一個字段等。因此,您將字段放在單獨的塊中,並且您使用正常管道方式處理該輸入,因此,您不會遇到多行字段的問題。 – 2011-03-03 22:25:16

+0

您可能可以使用空字節作爲分隔符:'select field1 || chr(0)|| field2 || chr(0)|| ...'。我不確定IFS在這種情況下看起來像什麼樣的ksh。 – 2011-03-03 23:03:39

0

讀了有關bash的「內部字段分隔符」 $ IFS

它被設置爲默認情況下爲空白,這可能會導致您的問題。