【问题标题】:Connect to sqlplus in a shell script and run SQL scripts在 shell 脚本中连接到 sqlplus 并运行 SQL 脚本
【发布时间】:2012-05-03 21:55:21
【问题描述】:

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

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

【问题讨论】:

    标签: bash shell sqlplus


    【解决方案1】:

    例如:

    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
    

    【讨论】:

    • 这是非常不安全的,因为任何人都可以在“sqlplus”运行时使用“ps”命令看到密码。
    • 嗨@NetBear,我认为你需要做sqlplus -s admin/password@server(在我的情况下,@server 部分是交易破坏者)。
    • 在远程数据库的第一行使用sqlplus -s &lt;username&gt;/&lt;password&gt;@&lt;db_ip&gt;:&lt;db_port&gt;/&lt;db_name&gt; &lt;&lt; EOF
    【解决方案2】:

    类似的东西在安全方面不是更好吗?:

    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 
    

    【讨论】:

    • 这比什么更安全?是什么让它更安全?尝试编辑您的帖子并添加此信息。还是您在问问题?
    • 这样更安全,因为ps -ea中不显示用户名/密码
    • 混乱,感谢您添加 - 是的,这是我的意图,我没有看到 keith 的回复,所以感谢您接受这个!
    • 为了后代:如果您使用 Bash 变量,请不要在 CONNECT 之后用双引号将它们括起来。所以CONNECT "$ORCL_CREDS" 不起作用。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      这应该可以解决问题:

      1. 何时 SQLERROR 退出 SQL.SQLCODE
      2. 假脱机 ${SPOOL_FILE}
      3. $RC 返回 oracle 的退出代码
      4. $SPOOL_FILE 中的 cat 解释错误
      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
      

      【讨论】:

        【解决方案5】:

        这里的一些其他答案启发我编写了一个脚本,用于使用 SQLPLUS 以及项目的 shell 命令自动混合顺序执行 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 作为第二个参数。包含凭据的变量是为了说明,但为了安全起见,我实际上是从另一个文件中获取它们的。如果您想处理多个数据库连接,您可以轻松修改函数以接受主机字符串作为附加参数。

        【讨论】:

          【解决方案6】:

          回显“退出” | echo "SELECT table_name FROM all_tables 仅获取前 10 行;" | sqlplus 管理员/密码 > outputFile.log

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-08-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-07-18
            • 2012-06-26
            相关资源
            最近更新 更多