web-dev-qa-db-ja.com

シェルスクリプトでsqlplusに接続し、SQLスクリプトを実行する

Oracle pl/sqlコマンドの集まりである.sqlファイルがあり、これらのコマンドを実行するシェルスクリプトを作成したい。

user/pass@serverが私の資格情報であるとします。このようなタスクを実行するためのシェルスクリプトは何ですか?

34
Farshid

例えば:

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
38
NetBear

これに似たものは、セキュリティ面で優れていると思いませんか?:

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 
24
Blaine DeLancey

出力をログファイルにリダイレクトして、エラーなどを探したい場合。このようなことができます。

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

これは問題を処理するはずです:

  1. いつでもSQLERROR EXIT SQL.SQLCODE
  2. スプール$ {SPOOL_FILE}
  3. $ RCはOracleの終了コードを返します
  4. $ SPOOL_FILEの猫がエラーを説明します
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

ここでの他の回答のいくつかは、以前に手動で行われていたプロジェクトのシェルコマンドと共にSQLPLUSを使用して、SQLタスクの混合順次実行を自動化するスクリプトを書くことに触発されました。たぶん、この(高度にサニタイズされた)例は他の誰かに役立つでしょう:

#!/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を使用すると、資格情報の文字列を最初の引数として、必要なSQLを2番目の引数として渡すことができます。資格情報を含む変数は説明のために含まれていますが、セキュリティのために実際には別のファイルから取得します。複数のデータベース接続を処理したい場合は、追加のパラメーターとしてホスト文字列を受け入れるように関数を簡単に変更できます。

0
Ketzak