0

より多くのオプションを使用できるように、既存のSQLPLUSスクリプトの一部をシェルスクリプトに変更するように依頼されました。

元の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

私のシェルスクリプトは次のようになります:

 #!/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を初めて使用するので、sqlprompt''からechooff Feedbackを設定すると、最初に設定した設定と関係があることがわかります。ただし、行を削除すると、スクリプトがハングします。

プロンプトをSQLPLUSから完全に取り出して、シェル部分でのみ使用する必要がありますか?

4

1 に答える 1

2

最も簡単なのは、SQL スクリプトからの対話を保持することです。あなたが現在与えていない何かを読みたいと思っています。ヒア ドキュメントは、変数を渡す優れた方法です。シェルの特殊文字に与える影響を忘れないでください... いつものように、同じことを行う方法は他にもあります。

しかし、はい、あなたの質問に対する答え: はい、相互作用を取り出し、呼び出しシェルで決定を準備します。

于 2013-02-05T20:34:45.250 に答える