【问题标题】:How to store result from SQLPlus to a shell variable如何将 SQLPlus 的结果存储到 shell 变量中
【发布时间】: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)中,语法不允许在 = 周围使用空格。

标签: shell unix sqlplus


【解决方案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 命令
    猜你喜欢
    • 2011-07-08
    • 2018-06-16
    • 1970-01-01
    • 2013-11-25
    • 2022-10-19
    • 2022-01-25
    • 1970-01-01
    • 2013-10-03
    • 2019-12-29
    相关资源
    最近更新 更多