我有一个 .sql 文件,它是一堆 oracle pl/sql 命令,我想创建一个 shell 脚本来运行这些命令。
假设这user/pass@server
是我的凭据。执行此类任务的 shell 脚本是什么?
例如:
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 -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
如果要将输出重定向到日志文件以查找错误或其他内容。你可以做这样的事情。
sqlplus -s <<EOF>> LOG_FILE_NAME user/passwd@host/db
#Your SQL code
EOF
这应该处理问题:
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
这里的一些其他答案启发我编写了一个脚本,用于使用 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 作为第二个参数传递。包含凭据的变量是为了说明,但为了安全起见,我实际上是从另一个文件中获取它们的。如果您想处理多个数据库连接,您可以轻松地修改函数以接受主机字符串作为附加参数。
回声“退出” | echo "SELECT table_name FROM all_tables 仅获取前 10 行;" | sqlplus 管理员/密码 > outputFile.log