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

将CHAR或CLOB sqlplus列存储到shell脚本变量中,shell,unix,ksh,sqlplus,Shell,Unix,Ksh,Sqlplus,当shell脚本变量中包含空格时,我很难将列值存储到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

当shell脚本变量中包含空格时,我很难将列值存储到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]}"
而不是

Message subject test
email1@email.com email2@email.com
基本上,如何在数组中只包含两个项(每列一个),而不是每个字包含五个项?用一个连接就可以做到这一点吗?我不希望每个列都启动一个新连接


编辑:另一件事,我的另一个CLOB列是EMAIL\u BODY,它基本上可以是任何文本-因此我不希望有预设的分隔符,因为EMAIL\u BODY可以有各种逗号、管道、新行,等等。

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

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

缺少的关键是将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]}"

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


默认情况下,它设置为空白,这可能会导致您的问题。

如何将它们分开?我在数据库中将EMAIL_SUBJECT的值更改为Message SUBJECT test,并设置了“COLSEP”,但它不起作用,但可能这不是您的意思我还将查询更改为SELECT EMAIL_SUBJECT,SELECT,','FROM DUAL,MAIL_改为FROM EMAIL_TABLE;与SET COLSEP配合使用时,不起作用either@beans:您可以引用任何sqlplus引用,只需搜索sqlplus set colsep即可。设置colsep的参数是要在列之间输出的字符串。您可以这样设置它:设置colsep'--'并查看发生了什么。很抱歉,sqlplus手边没有,因此无法提供完整的解决方案,但一旦您为您的环境选择了一个唯一的字符串,您就可以将该字符串之前的内容与之后的内容区分开来。@beans:或者您在shell方面遇到了问题?然后听听IFS的回答。或者您可以使用带-F字符串的awk。将查询更改为从EMAIL|表中选择“|||EMAIL|u SUBJECT”、||EMAIL|u到||”;仍然生成这些结果:SQL\u结果\u数组[0]=消息SQL\u结果\u数组[1]=主题SQL\u结果\u数组[2]=测试SQL\u结果\u数组[3]=email1@email.comSQL_结果_数组[4]=email2@email.comIncase glenn的建议没有解决这个问题,我认为sqlplus只是没有正确地填充数组,总是在不同的字段中。是否可以选择将sqlplus脚本的输出管道化为cut或awk?在我的小示例中,这实际上非常有效,但我的实际表中的另一列是EMAIL_BODY,如果将来有人决定在邮件中添加逗号或我选择的任何字符,那么选择一个不会意外拆分邮件正文的字符会带来巨大的风险。。。谢谢你!我会对此投票,但我没有足够的rep:@beans:可能在这种情况下,您应该选择一个字段,然后从dual中选择一个分隔符字符串,然后选择下一个字段,等等。因此,您的字段位于单独的块上,并且以正常的管道方式处理此输入。因此,多行字段没有问题。您可以使用空字节作为分隔符:选择field1 | | chr0 | | field2 | | chr0 |。。。。我不确定在这种情况下,ksh的IFS会是什么样子。
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]}"