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

8

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

sqlplus 'user/pwd' @test.sql

我已经尝试过

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

但是那行不通。

编辑:

我改成了

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

它显示如下:

SQL*Plus::未找到[没有这个文件或目录]

我尝试了以下方法:

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

我试过没有变量赋值的情况,结果显示了同样的错误。

sqlplus foo/bar@schm @test.sql

它正常工作


在 Bourne 类型的 shell(例如 bash)中,语法不允许在 = 周围使用空格。 - glenn jackman
4个回答

19

可以尝试使用以下方法:

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”,以防传递参数。 - agonen
谢谢。我正在寻找这样的语法。我不想使用 SQL 文件。 - Nicolas de Fontenay

12

使用反引号:

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

或者应该说这是语法上的眼毒:

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

你显然知道如何使用正确的sql*plus命令来限制多余的输出,是吗? :) 当然,要小心反引号会使输出的空白部分折叠。


2
反引号不会使输出的空格折叠——它只会删除尾随的换行符。此外,使用 $() 并不算是老派的做法,相反,它更加现代化。 - Roman Cheplyaka
2
正好相反:反引号是“老派的”。空格在赋值时不会丢失。如果变量没有加引号,在输出时才会丢失。 - Dennis Williamson
是的,关于 $() 你说得对。我后来确实编辑了以添加其他选项,但忘记切换了。 - Jé Queue
我尝试了以下代码: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 时,它可以正常工作。 - sarego
1
已经导出了PATH和ORACLE_HOME吗? - Jé Queue

1

由于$()中的命令在子shell中执行,请确保您已经导出了调用sqlplus所需的所有内容。现在,显然您遇到了PATH问题。


1
这里的解决方案都是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

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


@trenton-d-adams termout off - 意味着不在终端上显示。我认为最好保持打开状态,除非您使用 spool 命令。 - agonen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接