Oracle-实现事务提交和回滚
2022-08-02
Oracle-实现事务提交和回滚
背景:一直以来用sqlplus /执行多条sql时,某条sql失败后无法回滚前面的sql,并会继续执行下面的sql。即,如果 sqlplus 中遇到了一个 sql 或者 pl/ssql 错误, 一般会报告这个错误然后继续处理。在交互模式下, 这种处理是很理想的, 但是如果运行的是一个脚本,我们一般不希望失败了还继续执行 。这可太不科学了!经过高人指点,可以用一条命令来实现失败回滚功能。故在此学习和记录下。
失败回滚命令
WHENEVER SQLERROR
官网介绍: https://docs.oracle.com/en/database/oracle/oracle-database/19/sqpug/WHENEVER-SQLERROR.html#GUID-66C1C12C-5E95-4440-A37B-7CCE7E33491C
常见用法
WHENEVER SQLERROR {EXIT [SUCCESS | FAILURE | WARNING | n | variable | :BindVariable] [COMMIT | ROLLBACK] | CONTINUE [COMMIT | ROLLBACK | NONE]}
出现错误后退出sql执行
SQL> WHENEVER SQLERROR EXIT SQL.SQLCODE
出现错误后先回滚【还没提交的变化】再退出sql执行
SQL> WHENEVER SQLERROR EXIT SQL.SQLCODE ROLLBACK ---回滚退出,并返回错误码SQL.SQLCODE
or
SQL> WHENEVER SQLERROR SQL.SQLCODE EXIT ROLLBACK
失败不回滚命令
如果要实现失败不回滚(当发生错误时,对之前执行的语句进行提交,并保留SQL*Plus):
参考 https://juejin.cn/post/7075307770173456392
whenever sqlerror continue commit
spool命令
此外,可以先认识下spool
命令。
常用语法可参考:
https://blog.csdn.net/lixiaomei0623/article/details/121274473
spool的作用可以用一句话来描述:在sqlplus中用来保存或打印查询结果。
通过spool 命令,可以将select 数据库的内容写到文件中,通过在sqlplus设置一些参数,使得按指定方式写到文件中。
sql执行内容导出到某文件例子:
sqlplus oracle/pwd@192.168.10.16:1521/orl @/tmp/lxm/export.sql -- 执行语句
--- 以下为export.sql内容
set trimspool on
set linesize 20000
set pagesize 0
set echo off
set feedback off
set newpage 1
set heading off
set wrap off SQLBLANKLINES ON ---去掉空行
set term off
---以上为输出格式设置
spool /home/oracle/aaa.csv ---保存查询结果集的的路径和文件名
select python_student.name||','||python_student.age
from python_student;
spool off ---完成spool
举例
使用命令行
来自 http://blog.itpub.net/28916011/viewspace-2774514/ 的例子:
SQL>spool e:\test.txt
SQL>whenever sqlerror exit rollback
SQL>select * from test1233;
SQL>select * from dual;
SQL>spool off
使用sqlplus
来自 https://juejin.cn/post/7075307770173456392 的例子:
#!/bin/sh
echo "SQL*Plus-语句执行异常则退出"
sqlplus user/password@x.x.x.x:x/orcl <<EOF
whenever sqlerror exit failure rollback
${1}
EOF
return $?
参考链接
http://blog.itpub.net/28916011/viewspace-2774514/
https://www.cnblogs.com/moveofgod/archive/2013/11/18/3428933.html