SQL*Plus 与 shell 配合

583 阅读1分钟

通常在使用shell脚本进行数据库操作时,我们必须要知道数据库语句的执行状况,根据结果进行后续逻辑的处理

WHENEVER SQLERROR

SQL*Plus 提供了一种触发器:

当捕获到数据库语句或者PL/SQL 代码块异常时,可以进行相应的特殊处理操作。

WHENEVER SQLERROR {EXIT [SUCCESS | FAILURE | WARNING | n | variable  | :BindVariable] [COMMIT | ROLLBACK] | CONTINUE [COMMIT | ROLLBACK | NONE]}

Example

  1. 当发生错误时,进行回滚并退出,返回错误码
whenever sqlerror exit SQL.SQLCODE rollback
  1. 当发生错误时,对之前执行的语句进行提交,并保留SQL*Plus
whenever sqlerror continue commit

实战

在工作中,我们需要对此功能进行包装,方便同事们的使用

sh脚本

下面是脚本内容

#!/bin/shecho "SQL*Plus-语句执行异常则退出"
​
sqlplus user/password@x.x.x.x:x/orcl <<EOF
whenever sqlerror exit failure rollback
${1}
EOFreturn $?

分离 SQL*Plus初始化设置

后续经过资料查阅,Oracle 提供了默认的SQL*Plus的初始化脚本执行逻辑;

  • 扫描ORACLE_PATH变量下的login.sql,并进行执行

进而对脚本进行改造:

#!/bin/shecho "SQL*Plus-语句执行异常则退出"
ORACLE_PATH=~/user/sqlplus/
​
sqlplus user/password@x.x.x.x:x/orcl <<EOF
${1}
EOFreturn $?

~/user/sqlplus/login.sql 脚本内容如下:

whenever sqlerror exit failure rollback

参考资料

官方文档: WHENEVER SQLERRORConfiguring SQL*Plus

参考资料: 12c-Oracle 12c R2 注意事项:login.sql 改变