it-swarm.com.de

Stellen Sie in einem Shell-Skript eine Verbindung zu sqlplus her und führen Sie SQL-Skripts aus

Ich habe eine .sql-Datei, eine Reihe von Oracle pl/sql-Befehlen, und ich möchte ein Shell-Skript erstellen, um diese Befehle auszuführen. 

Angenommen, user/[email protected] ist meine Berechtigung. Was wird das Shell-Skript sein, um eine solche Aufgabe auszuführen?

31
Farshid

Zum Beispiel:

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

Wäre etwas Ähnliches nicht besser aus Sicherheitsgründen ?:

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

Wenn Sie die Ausgabe in eine Protokolldatei umleiten möchten, um nach Fehlern oder etwas zu suchen. Sie können so etwas tun.

sqlplus -s <<EOF>> LOG_FILE_NAME user/[email protected]/db
#Your SQL code
EOF
4
darwinbaisa

Dies sollte das Problem behandeln:

  1. WHENEVER SQLERROR EXIT SQL.SQLCODE
  2. SPOOL $ {SPOOL_FILE} 
  3. $ RC gibt den Exit-Code von Oracle zurück
  4. cat aus $ SPOOL_FILE erklärt den Fehler
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

Einige der anderen Antworten hier haben mich dazu inspiriert, ein Skript zu schreiben, mit dem Sie die gemischte sequentielle Ausführung von SQL-Aufgaben mithilfe von SQLPLUS zusammen mit Shell-Befehlen für ein Projekt automatisieren können. Dieser Prozess wurde zuvor manuell ausgeführt. Vielleicht wird dieses (stark bereinigte) Beispiel für jemanden anderen nützlich sein:

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

runsql () {
  # param 1 is $1
sqlplus -S /nolog << EOF
CONNECT [email protected]$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"

Mit runsql können Sie eine Anmeldeinformationszeichenfolge als erstes Argument und jede erforderliche SQL als zweites Argument übergeben. Die Variablen, die die Berechtigungsnachweise enthalten, sind zur Veranschaulichung enthalten, aber zur Sicherheit beziehe ich sie tatsächlich aus einer anderen Datei. Wenn Sie mehrere Datenbankverbindungen handhaben möchten, können Sie die Funktion leicht ändern, um den Hoststring als zusätzlichen Parameter zu akzeptieren.

0
Ketzak