如何将 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 变量中的主要内容,如果未能解决你的问题,请参考以下文章

如何使用sqlplus在shell中存储存储过程返回的多个输出列

如何将选择的结果分配给 sqlplus 变量

shell结果输出到其他服务器

如何在shell中调SQLPLUS 执行SQL语句

如何在shell 中将sql语句执行结果写入日志中

如何在shell中调SQLPLUS 执行SQL语句