在shell脚本中连接到sqlplus并运行SQL脚本

时间:2012-04-23 09:31:36

标签: bash shell sqlplus

我有一个.sql文件,这是一堆oracle pl / sql命令,我想创建一个shell脚本来运行这些命令。

假设user/pass@server是我的凭据。执行此类任务的shell脚本是什么?

6 个答案:

答案 0 :(得分:37)

例如:

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

答案 1 :(得分:23)

在安全方面,这类似乎不会更好吗?:

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 

答案 2 :(得分:5)

如果要将输出重定向到日志文件以查找错误或其他内容。你可以这样做。

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

答案 3 :(得分:3)

这应该处理问题:

  1. WHEREVER SQLERROR EXIT SQL.SQLCODE
  2. SPOOL $ {SPOOL_FILE}
  3. $ RC返回oracle的退出代码
  4. 来自$ SPOOL_FILE的
  5. cat解释错误
  6. 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
    

答案 4 :(得分:0)

这里的其他一些答案启发我编写了一个脚本,该脚本使用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作为第二个参数传递。为了说明起见,包含了包含凭据的变量,但是出于安全考虑,我实际上是从另一个文件中获取它们的。如果要处理多个数据库连接,则可以轻松地修改该函数以接受主机字符串作为附加参数。

答案 5 :(得分:0)

echo "exit" | echo "SELECT table_name FROM all_tables FETCH FIRST 10 ROWS ONLY;" | sqlplus 管理员/密码 > outputFile.log