我的要求是将sqlplus操作的结果存储到我的shell脚本中的变量中。 我需要以下操作的结果,该操作位于我的.sh文件中
sqlplus 'user/pwd' @test.sql
我已经尝试了
testvar = 'sqlplus 'user/pwd'
@test.sql'
但这不起作用。
我把它改成了
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
一切正常
答案 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命令确保您可以读取每个循环的每个数据库行。