将CHAR或CLOB sqlplus列存储到shell脚本变量中

时间:2011-03-03 21:01:07

标签: shell unix ksh sqlplus

当包含空格时,我将列值存储到shell脚本变量中时遇到问题,因为所有结果都是在空格而不是实际列值上拆分的。

例如,这就是我现在所拥有的:

set -A SQL_RESULTS_ARRAY `sqlplus -s un/pass@database << 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
email1@email.com email2@email.com

基本上,我如何最终只得到数组中的两个项目(每列一个),而不是五个项目(每个单词一个)?只需一次连接即可实现这一切吗? (我不想每列开始一个新连接)

编辑:另一件事,我的另一个CLOB列是EMAIL_BODY,它基本上可以是任何文本 - 因此我宁愿没有预设分隔符,因为EMAIL_BODY可以有各种逗号,管道,新行,等...

4 个答案:

答案 0 :(得分:2)

您缺少的密钥是将shell的IFS(内部字段分隔符)设置为与查询结果相同。这是一个ksh会话:

$ results="Message subject test,email1@email.com email2@email.com"
$ set -A ary $results
$ for i in 0 1 2 3 4; do print "$i. ${ary[$i]}"; done
0. Message
1. subject
2. test,email1@email.com
3. email2@email.com
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. email1@email.com email2@email.com
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]}"

答案 1 :(得分:0)

您可以尝试设置COLSEP并按其值分隔。

答案 2 :(得分:0)

尝试在select语句中使用字符串连接添加双引号。引用的数组元素允许空格(至少在bash中)。

答案 3 :(得分:0)

阅读bash的“内部字段分隔符”$ IFS

默认设置为空格,这可能会导致您的问题。