如何将SQLPlus的结果存储到shell变量中

时间:2011-02-10 05:51:04

标签: shell unix sqlplus

我的要求是将sqlplus操作的结果存储到我的shell脚本中的变量中。 我需要以下操作的结果,该操作位于我的.sh文件中

sqlplus 'user/pwd' @test.sql

我已经尝试了

testvar = 'sqlplus 'user/pwd'
@test.sql'

但这不起作用。

EDIT ::

我把它改成了

testvar=sqlplus foo/bar@SCHM @test.sql

它说

  

SQL*Plus:: not found [No such file or directory]

我试过

testvar=$(sqlplus foo/bar@SCHM
@test.sql)

并且它给出了同样的错误。 当我尝试没有像下面的变量赋值

sqlplus foo/bar@schm @test.sql

一切正常

4 个答案:

答案 0 :(得分:19)

请改为尝试:

testvar=`sqlplus -s foo/bar@SCHM <<EOF
set pages 0
set head off
set feed off
@test.sql
exit
EOF`
当sqlplus启动时,

-s开关将关闭所有标题信息。你还想关闭反馈,标题和页面大小为0.我老了所以我仍然使用后面的滴答声:)

答案 1 :(得分:9)

使用反引号:

testvar=`sqlplus foo/bar @test.sql`

或者应该是语法上的眼睛:

testvar=$(sqlplus foo/bar @test.sql)

你清楚地知道采用正确的sql * plus命令来限制多余的输出,是吗? :)当然要注意反击会破坏输出的空白。

答案 2 :(得分:1)

由于$()中的命令在子shell中执行,请确保您拥有调用sqlplus导出所需的一切。现在你明显偶然发现了PATH问题。

答案 3 :(得分:1)

这里的解决方案都是黑客攻击。

您的sql文件应如下所示......

set termout off
set showmode off
set heading off
set echo off
set timing off
set time off
set feedback 0
set pagesize 0
set embedded ON
set verify OFF

spool courses.sh
SELECT 'term="' || sfrstcr_term_code || '";', 'subj="' || sfrstcr_subj_code || '";' FROM sfrstcr WHERE sfrstcr_pidm = 1234567;
spool off

以下shell脚本将读取并打印出shell环境变量。

while read -r row; do
  eval "$row"
  echo "term=$term"; 
  echo "subj=$subj"; 
done < courses.sh

所有变量都在一行上非常重要,因为read命令确保您可以读取每个循环的每个数据库行。