【问题标题】:How to pass input from shell script to sqlplus?如何将shell脚本的输入传递给sqlplus?
【发布时间】:2013-02-05 19:49:51
【问题描述】:

我被要求将现有 SQLPLUS 脚本的一部分更改为 shell 脚本以允许更多选项。

这是原始 SQLPLUS 脚本提示的内容:

SPOOL results.txt;
WHENEVER OSERROR EXIT 9;
WHENEVER SQLERROR EXIT SQL.SQLCODE;
PROMPT
PROMPT This script upgrades the database to the most recent version of eV8.0.
SET VERIFY OFF;
SET SERVEROUTPUT ON;

ACCEPT continue_flag CHAR PROMPT 'Are You ready to continue Y/N? '
PROMPT

我的 shell 脚本现在看起来像:

 #!/bin/sh

echo "Please enter database username"
read eval_user
echo "Please enter database password"
read eval_pass
echo "Please enter the database name"
read db_name

$ORACLE_HOME/bin/sqlplus -s /nolog <<-EOF >> ${LOGFILE}
connect $eval_user/$eval_pass@$db_name

set serveroutput on format wrapped
set pages 0 lines 300 trimout on trimspool on
set echo off feedback off sqlprompt ''

SPOOL results.txt;
WHENEVER OSERROR EXIT 9;
WHENEVER SQLERROR EXIT SQL.SQLCODE;
PROMPT
SET VERIFY OFF;
SET SERVEROUTPUT ON;

ACCEPT continue_flag CHAR PROMPT 'Are You ready to continue Y/N? '
PROMPT

到达 SQLPLUS 提示行时出现此错误:

Are You ready to continue Y/N? You have entered an invalid response. Exiting.
BEGIN
*
ERROR at line 1:
ORA-06501: PL/SQL: program error
ORA-06512: at line 13

我是 sqlplus 新手,所以我知道这与我一开始设置的设置有关,如果我设置 echo off feedback off sqlprompt ''。但是,在删除该行时,脚本只是挂起。

我应该完全从 SQLPLUS 中取出提示,只在 shell 部分使用它吗?

【问题讨论】:

  • 我在 DB 脚本中使用的一个技巧是获取一个生成 SQL 的脚本,然后在我想执行它时通过sqlplus 管道它。好处是脚本生成器可以使用 Python/Perl 的所有功能变得复杂。这类似于echo rm afile.txt 检查输出,然后在准备提交时执行echo rm afile.txt | sh

标签: oracle shell unix sqlplus


【解决方案1】:

最简单的方法是保留 sql 脚本的交互。它确实想读一些你目前没有给它的东西。 这里的文档是传递变量的好方法。不要忘记它对 shell 特殊字符的影响...... 与往常一样,还有更多方法可以做到这一点。

但是,是的,您的问题的答案是:是的,取出交互并在调用 shell 中准备决策。

【讨论】:

  • 在运行 shell 脚本时是否可以将 SQLPLUS 脚本的输出重定向到屏幕上?或者,线轴是我们唯一的选择吗?
  • 是的,你可以spool到标准输出,没问题,只是不要重定向。如果要捕获特定结果,请使用 spool 。只要不设置 termout 关闭,输出就会写入 stdout。
  • 如何捕获 sqlplus 中产生的错误?喜欢 ORA 的?
猜你喜欢
  • 2013-07-08
  • 2018-05-15
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2013-05-04
  • 2017-08-07
相关资源
最近更新 更多