如何将shell脚本的输入传递给sqlplus?

时间:2013-02-05 19:49:51

标签: oracle shell unix sqlplus

我被要求将现有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关闭sqlprompt''的反馈。但是,在删除该行时,脚本就会挂起。

我是否应该完全从SQLPLUS中提取提示并仅在shell部分中使用它?

1 个答案:

答案 0 :(得分:2)

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

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