在Shell脚本中将Oracle SQL查询结果赋值给变量遇阻求助
解决Shell脚本中Oracle SQL查询结果无法正确存入变量的问题
我来帮你排查这个问题——你的核心问题出在SQLPlus命令的格式上,把所有参数和SQL语句挤在EOF同一行导致SQLPlus无法正确解析命令,反而输出了默认的版本信息。咱们一步步来修正:
问题根源
你原来的here-doc内容没有正确换行,SQL*Plus会把set pagesize 0 feedback off verify off heading off echo off; SELECT ERROR from temp_table exit;当成一整串无法识别的命令,自然不会执行你的查询,直接返回了启动信息。
修正后的脚本
把命令拆分成单独的行,并且确保EOF标记顶格(前后不能有空格,否则here-doc无法正确结束):
billerrors=$(sqlplus -s "$username/$password@$SID" << EOF set pagesize 0 feedback off verify off heading off echo off trimspool on SELECT ERROR from temp_table; exit; EOF ) echo "$billerrors"
关键调整点:
-s参数已经启用了静默模式,但仍需要正确设置SQL*Plus的环境参数,多个set选项可以合并在一行用空格分隔,更简洁。- 添加
trimspool on可以去掉结果中多余的尾部空格,让输出更干净。 - SQL语句末尾加上分号
;,确保SQL*Plus能识别这是一个完整的查询。 exit;单独一行,保证SQL*Plus执行完查询后正常退出。- 变量引用时用双引号包裹
"$billerrors",避免输出时丢失换行或特殊格式的空格。
额外验证建议
如果还是有问题,可以先手动在终端执行SQL*Plus命令,确认查询本身能返回预期结果:
sqlplus -s $username/$password@$SID set pagesize 0 feedback off verify off heading off echo off trimspool on SELECT ERROR from temp_table; exit;
手动执行没问题的话,再放到shell脚本里就应该能正常工作了。
内容的提问来源于stack exchange,提问作者Sai Avinash




