web-dev-qa-db-fra.com

Connectez-vous à sqlplus dans un script Shell et exécutez des scripts SQL

J'ai un fichier .sql, qui est un groupe de commandes Oracle pl/sql et je veux créer un script Shell pour exécuter ces commandes. 

Supposons que user/pass@server soit mes informations d'identification. Quel sera le script shell pour effectuer une telle tâche?

31
Farshid

Par exemple:

sqlplus -s admin/password << EOF
whenever sqlerror exit sql.sqlcode;
set echo off 
set heading off

@pl_script_1.sql
@pl_script_2.sql

exit;
EOF
34
NetBear

Est-ce que quelque chose de semblable à cela ne serait pas mieux, du point de vue de la sécurité ?:

sqlplus -s /nolog << EOF
CONNECT admin/password;

whenever sqlerror exit sql.sqlcode;
set echo off 
set heading off

@pl_script_1.sql
@pl_script_2.sql

exit;
EOF 
21
Blaine DeLancey

Si vous souhaitez rediriger la sortie vers un fichier journal pour rechercher des erreurs ou autre chose. Vous pouvez faire quelque chose comme ça.

sqlplus -s <<EOF>> LOG_FILE_NAME user/passwd@Host/db
#Your SQL code
EOF
4
darwinbaisa

Cela devrait traiter le problème:

  1. QUAND QUE SQLERROR EXIT SQL.SQLCODE
  2. SPOOL $ {SPOOL_FILE} 
  3. $ RC retourne le code de sortie d'Oracle
  4. le chat de $ SPOOL_FILE explique l'erreur
SPOOL_FILE=${LOG_DIR}/${LOG_FILE_NAME}.spool 

SQLPLUS_OUTPUT=`sqlplus -s  "$SFDC_WE_CORE" <<EOF 
        SET HEAD OFF
        SET AUTOPRINT OFF
        SET TERMOUT OFF
        SET SERVEROUTPUT ON

        SPOOL  ${SPOOL_FILE} 

        WHENEVER SQLERROR EXIT SQL.SQLCODE
        DECLARE 

        BEGIN
           foooo 
        --rollback; 
        END;
    /
    EOF` 

RC=$?

if [[ $RC != 0 ]] ; then

    echo " RDBMS exit code : $RC  "     | tee -a ${LOG_FILE}
    cat ${SPOOL_FILE}                   | tee -a ${LOG_FILE}

    cat ${LOG_FILE} | mail -s "Script ${INIT_EXE} failed on $SFDC_ENV" $SUPPORT_LIST

    exit 3

fi
3
Rafał Sardaw

Certaines des autres réponses ici m'ont incité à écrire un script pour automatiser l'exécution séquentielle mixte de tâches SQL à l'aide de SQLPLUS ainsi que des commandes Shell pour un projet, processus qui était auparavant effectué manuellement. Peut-être que cet exemple (hautement assaini) sera utile à quelqu'un d'autre:

#!/bin/bash
acreds="user_a/supergreatpassword"
bcreds="user_b/anothergreatpassword"
hoststring='fancyoraclehoststring'

runsql () {
  # param 1 is $1
sqlplus -S /nolog << EOF
CONNECT $1@$hoststring;
whenever sqlerror exit sql.sqlcode;
set echo off
set heading off
$2
exit;
EOF
}

echo "TS::$(date): Starting SCHEM_A.PROC_YOU_NEED()..."
runsql "$acreds" "execute SCHEM_A.PROC_YOU_NEED();"

echo "TS::$(date): Starting superusefuljob..."
/var/scripts/superusefuljob.sh

echo "TS::$(date): Starting SCHEM_B.SECRET_B_PROC()..."
runsql "$bcreds" "execute SCHEM_B.SECRET_B_PROC();"

echo "TS::$(date): DONE"

runsql vous permet de transmettre une chaîne d'informations d'identification comme premier argument et tout code SQL nécessaire comme second argument. Les variables contenant les informations d'identification sont incluses à titre d'illustration, mais pour des raisons de sécurité, je les source à partir d'un autre fichier. Si vous souhaitez gérer plusieurs connexions à une base de données, vous pouvez facilement modifier la fonction pour accepter la chaîne hôte en tant que paramètre supplémentaire.

0
Ketzak