如何将 SQLPlus 的结果存储到 shell 变量中
Posted
技术标签:
【中文标题】如何将 SQLPlus 的结果存储到 shell 变量中【英文标题】:How to store result from SQLPlus to a shell variable 【发布时间】:2011-02-10 05:51:04 【问题描述】:我的要求是将 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
效果很好
【问题讨论】:
在 Bourne 类型的 shell(例如 bash)中,语法不允许在=
周围使用空格。
【参考方案1】:
试试这个:
testvar=`sqlplus -s foo/bar@SCHM <<EOF
set pages 0
set head off
set feed off
@test.sql
exit
EOF`
-s 开关将在 sqlplus 启动时关闭所有头信息。您还想将反馈、标题和页面大小关闭为 0。我是老派,所以我仍然使用反引号 :)
【讨论】:
应该加上verify off,以防传参数 谢谢。我正在寻找这样的语法。我不想使用 sql 文件。【参考方案2】:使用反引号:
testvar=`sqlplus foo/bar @test.sql`
或者那应该是句法上的讨厌:
testvar=$(sqlplus foo/bar @test.sql)
你清楚地知道使用正确的 sql*plus 命令来限制多余的输出,是吗? :) 当然要注意反引号会折叠输出的空白。
【讨论】:
“反引号将折叠输出的空白” - 它不会。它只会删除尾随的换行符。此外,使用$()
并没有什么老派,而是相反。
反之亦然:反引号是“老派”。分配时不会丢失空格。如果变量没有被引用,它会在输出中丢失。
是的,你对 $()
的看法是正确的
我做了 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 之类的变量赋值时,它可以正常工作
PATH 和 ORACLE_HOME 导出了吗?【参考方案3】:
由于$()
中的命令在子shell 中执行,因此请确保您已导出调用sqlplus 所需的一切。现在你显然偶然发现了PATH
问题。
【讨论】:
【参考方案4】:这里的解决方案都是hack。
您的 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 命令确保您可以在每个循环中读取每个 DB 行。
【讨论】:
@trenton-d-adams termout off - 表示终端不显示。我认为最好保持打开状态,除非您使用 spool 命令以上是关于如何将 SQLPlus 的结果存储到 shell 变量中的主要内容,如果未能解决你的问题,请参考以下文章