Comment passer l’entrée du script shell à sqlplus?

On m’a demandé de remplacer une partie du script SQLPLUS existant par un script shell pour permettre plus d’options.

Voici ce que le script SQLPLUS original demandait:

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 

Mon script shell ressemble maintenant à:

  #!/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 <> ${LOGFILE} connect $eval_user/$eval_pass@$db_name set serveroutput on format wrapped set pages 0 lines 300 sortingmout on sortingmspool 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 

J’obtiens cette erreur lorsque la ligne d’invite SQLPLUS est atteinte:

 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 

Je suis nouveau sur sqlplus, donc je sais que cela a quelque chose à voir avec les parameters que j’ai définis au début, si je mets echo off feedback hors sqlprompt ”. Mais, en supprimant la ligne, le script se bloque.

Dois-je extraire complètement les invites de SQLPLUS et les utiliser uniquement dans la partie shell?

Le plus simple est de conserver les interactions du script SQL. Il veut lire quelque chose que vous ne lui donnez pas actuellement. Le document ici est un bon moyen de passer des variables. N’oubliez pas l’effet qu’il a sur les caractères spéciaux du shell … Comme toujours, il y a plus de façons de faire la même chose.

Mais oui, la réponse à votre question: OUI, éliminez les interactions et préparez les décisions dans le shell appelant.