SQL开发知识:oracle多条sql执行中间的语句出现错误时的处理解决方式
多条sql执行时如果在中间的语句出现错误,后续会不会直接执行,如何进行设定,以及其他数据库诸如Mysql是如何对应的,这篇文章将会进行简单的整理和说明。
环境准备
使用Oracle的精简版创建docker方式的demo环境,详细可参看:
多行语句的正常执行对上篇文章创建的两个字段的学生信息表,正常添加三条数据,详细如下:
# sqlplus system/liumiao123@XE EOF
desc student
select * from student;
insert into student values (1001, liumiaocn );
insert into student values (1002, liumiao );
insert into student values (1003, michael );
commit;
select * from student;
EOF
SQL*Plus: Release 11.2.0.2.0 Production on Sun Oct 21 12:08:35 2018
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 64bit Production
SQL Name Null Type
-
STUID NOT NULL NUMBER(4)
STUNAME VARCHAR2(50)
SQL
no rows selected
SQL
1 row created.
SQL
1 row created.
SQL
1 row created.
SQL
Commit complete.
SQL
STUID STUNAME
-
1001 liumiaocn
1002 liumiao
1003 michael
SQL Disconnected from Oracle Database 11g Express Edition Release 11.2.0.2.0 64bit Production
#
多行语句中间出错时的缺省动作
问题:
三行insert语句,如果中间的一行出错,缺省的状况下第三行会不会被插入进去?
我们将第二条insert语句的主键故意设定重复,然后进行确认第三条数据是否会进行插入即可。
# sqlplus system/liumiao123@XE EOF
desc student
delete from student;
select * from student;
insert into student values (1001, liumiaocn );
insert into student values (1001, liumiao );
insert into student values (1003, michael );
select * from student;
commit;
EOF
SQL*Plus: Release 11.2.0.2.0 Production on Sun Oct 21 12:15:16 2018
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 64bit Production
SQL Name Null Type
-
STUID NOT NULL NUMBER(4)
STUNAME VARCHAR2(50)
SQL
2 rows deleted.
SQL
no rows selected
SQL
1 row created.
SQL insert into student values (1001, liumiao )
*
ERROR at line 1:
ORA-00001: unique constraint (SYSTEM.SYS_C007024) violated
SQL
1 row created.
SQL
STUID STUNAME
-
1001 liumiaocn
1003 michael
SQL SQL Disconnected from Oracle Database 11g Express Edition Release 11.2.0.2.0 64bit Production
#
结果非常清晰地表明是会继续执行的,在oracle中通过什么来对其进行控制呢?
WHENEVER SQLERROR
答案很简单,在oracle中通过WHENEVER SQLERROR来进行控制。
WHENEVER SQLERROR {EXIT [SUCCESS | FAILURE | WARNING | n | variable | :BindVariable] [COMMIT | ROLLBACK] | CONTINUE [COMMIT | ROLLBACK | NONE]}
WHENEVER SQLERROR EXIT
添加此行设定,即会在失败的时候立即推出,接下来我们进行确认:
# sqlplus system/liumiao123@XE EOF
WHENEVER SQLERROR EXIT
desc student
delete from student;
select * from student;
insert into student values (1001, liumiaocn );
insert into student values (1001, liumiao );
insert into student values (1003, michael );
select * from student;
commit;
EOF
SQL*Plus: Release 11.2.0.2.0 Production on Sun Oct 21 12:27:15 2018
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 64bit Production
SQL SQL Name Null Type
-
STUID NOT NULL NUMBER(4)
STUNAME VARCHAR2(50)
SQL
2 rows deleted.
SQL
no rows selected
SQL
1 row created.
SQL insert into student values (1001, liumiao )
*
ERROR at line 1:
ORA-00001: unique constraint (SYSTEM.SYS_C007024) violated
Disconnected from Oracle Database 11g Express Edition Release 11.2.0.2.0 64bit Production
#
WHENEVER SQLERROR CONTINUE
使用CONTINUE则和缺省方式下的行为一致,出错仍然继续执行
# sqlplus system/liumiao123@XE EOF
WHENEVER SQLERROR CONTINUE
desc student
delete from student;
select * from student;
insert into student values (1001, liumiaocn );
insert into student values (1001, liumiao );
insert into student values (1003, michael );
select * from student;
commit;
EOF
SQL*Plus: Release 11.2.0.2.0 Production on Sun Oct 21 12:31:54 2018
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 64bit Production
SQL SQL Name Null Type
-
STUID NOT NULL NUMBER(4)
STUNAME VARCHAR2(50)
SQL
1 row deleted.
SQL
no rows selected
SQL
1 row created.
SQL insert into student values (1001, liumiao )
*
ERROR at line 1:
ORA-00001: unique constraint (SYSTEM.SYS_C007024) violated
SQL
1 row created.
SQL
STUID STUNAME
-
1001 liumiaocn
1003 michael
SQL
Commit complete.
SQL Disconnected from Oracle Database 11g Express Edition Release 11.2.0.2.0 64bit Production
#
Mysql中类似的机制
mysql中使用source是否提供相关的类似机制的问题中,最终引入了Oracle此项功能在mysql中引入的建议,详细请参看:
https://bugs.mysql.com/bug.php?id=73177所以目前这只是一个sqlplus端的强化功能,并非标准,不同数据库需要确认相应的功能是否存在。
小结
Oracle中使用WHENEVER SQLERROR进行出错控制是否继续,本文给出的例子非常简单,详细功能的使用可根据文中列出的Usage进行自行验证和探索。
总结
多条sql执行时如果在中间的语句出现错误,后续会不会直接执行,如何进行设定,以及其他数据库诸如Mysql是如何对应的,这篇文章将会进行简单的整理和说明。
环境准备
使用Oracle的精简版创建docker方式的demo环境,详细可参看:
多行语句的正常执行对上篇文章创建的两个字段的学生信息表,正常添加三条数据,详细如下:
# sqlplus system/liumiao123@XE EOF
desc student
select * from student;
insert into student values (1001, liumiaocn );
insert into student values (1002, liumiao );
insert into student values (1003, michael );
commit;
select * from student;
EOF
SQL*Plus: Release 11.2.0.2.0 Production on Sun Oct 21 12:08:35 2018
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 64bit Production
SQL Name Null Type
-
STUID NOT NULL NUMBER(4)
STUNAME VARCHAR2(50)
SQL
no rows selected
SQL
1 row created.
SQL
1 row created.
SQL
1 row created.
SQL
Commit complete.
SQL
STUID STUNAME
-
1001 liumiaocn
1002 liumiao
1003 michael
SQL Disconnected from Oracle Database 11g Express Edition Release 11.2.0.2.0 64bit Production
#
多行语句中间出错时的缺省动作
问题:
三行insert语句,如果中间的一行出错,缺省的状况下第三行会不会被插入进去?
我们将第二条insert语句的主键故意设定重复,然后进行确认第三条数据是否会进行插入即可。
# sqlplus system/liumiao123@XE EOF
desc student
delete from student;
select * from student;
insert into student values (1001, liumiaocn );
insert into student values (1001, liumiao );
insert into student values (1003, michael );
select * from student;
commit;
EOF
SQL*Plus: Release 11.2.0.2.0 Production on Sun Oct 21 12:15:16 2018
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 64bit Production
SQL Name Null Type
-
STUID NOT NULL NUMBER(4)
STUNAME VARCHAR2(50)
SQL
2 rows deleted.
SQL
no rows selected
SQL
1 row created.
SQL insert into student values (1001, liumiao )
*
ERROR at line 1:
ORA-00001: unique constraint (SYSTEM.SYS_C007024) violated
SQL
1 row created.
SQL
STUID STUNAME
-
1001 liumiaocn
1003 michael
SQL SQL Disconnected from Oracle Database 11g Express Edition Release 11.2.0.2.0 64bit Production
#
结果非常清晰地表明是会继续执行的,在oracle中通过什么来对其进行控制呢?
WHENEVER SQLERROR
答案很简单,在oracle中通过WHENEVER SQLERROR来进行控制。
WHENEVER SQLERROR {EXIT [SUCCESS | FAILURE | WARNING | n | variable | :BindVariable] [COMMIT | ROLLBACK] | CONTINUE [COMMIT | ROLLBACK | NONE]}
WHENEVER SQLERROR EXIT
添加此行设定,即会在失败的时候立即推出,接下来我们进行确认:
# sqlplus system/liumiao123@XE EOF
WHENEVER SQLERROR EXIT
desc student
delete from student;
select * from student;
insert into student values (1001, liumiaocn );
insert into student values (1001, liumiao );
insert into student values (1003, michael );
select * from student;
commit;
EOF
SQL*Plus: Release 11.2.0.2.0 Production on Sun Oct 21 12:27:15 2018
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 64bit Production
SQL SQL Name Null Type
-
STUID NOT NULL NUMBER(4)
STUNAME VARCHAR2(50)
SQL
2 rows deleted.
SQL
no rows selected
SQL
1 row created.
SQL insert into student values (1001, liumiao )
*
ERROR at line 1:
ORA-00001: unique constraint (SYSTEM.SYS_C007024) violated
Disconnected from Oracle Database 11g Express Edition Release 11.2.0.2.0 64bit Production
#
WHENEVER SQLERROR CONTINUE
使用CONTINUE则和缺省方式下的行为一致,出错仍然继续执行
# sqlplus system/liumiao123@XE EOF
WHENEVER SQLERROR CONTINUE
desc student
delete from student;
select * from student;
insert into student values (1001, liumiaocn );
insert into student values (1001, liumiao );
insert into student values (1003, michael );
select * from student;
commit;
EOF
SQL*Plus: Release 11.2.0.2.0 Production on Sun Oct 21 12:31:54 2018
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 64bit Production
SQL SQL Name Null Type
-
STUID NOT NULL NUMBER(4)
STUNAME VARCHAR2(50)
SQL
1 row deleted.
SQL
no rows selected
SQL
1 row created.
SQL insert into student values (1001, liumiao )
*
ERROR at line 1:
ORA-00001: unique constraint (SYSTEM.SYS_C007024) violated
SQL
1 row created.
SQL
STUID STUNAME
-
1001 liumiaocn
1003 michael
SQL
Commit complete.
SQL Disconnected from Oracle Database 11g Express Edition Release 11.2.0.2.0 64bit Production
#
Mysql中类似的机制
mysql中使用source是否提供相关的类似机制的问题中,最终引入了Oracle此项功能在mysql中引入的建议,详细请参看:
https://bugs.mysql.com/bug.php?id=73177所以目前这只是一个sqlplus端的强化功能,并非标准,不同数据库需要确认相应的功能是否存在。
小结
Oracle中使用WHENEVER SQLERROR进行出错控制是否继续,本文给出的例子非常简单,详细功能的使用可根据文中列出的Usage进行自行验证和探索。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接
我想要获取技术服务或软件
服务范围:MySQL、ORACLE、SQLSERVER、MongoDB、PostgreSQL 、程序问题
服务方式:远程服务、电话支持、现场服务,沟通指定方式服务
技术标签:数据恢复、安装配置、数据迁移、集群容灾、异常处理、其它问题
本站部分文章参考或来源于网络,如有侵权请联系站长。
数据库远程运维 SQL开发知识:oracle多条sql执行中间的语句出现错误时的处理解决方式
相关文章
- ORA-13802: failed to purge SQL Tuning Base entry from sql$ ORACLE 报错 故障修复 远程处理
- Oracle查询按区间统计数据的实战经验(oracle按区间统计)
- 馆知识宝库:探索Oracle图书馆(oracle图书)
- 深入理解Oracle 中的触发器类型(oracle触发器类型)
- Oracle尽善尽美:破解极致数据库性能的完美栓螺母(oracle栓)
- ORACLE高手分享:拼SQL技巧大揭秘(oracle拼sql)
- Oracle 入门经典:一步成功之路(oracle入门经典)
- Oracle 逗号拆分:编码、超越限制(oracle逗号拆分)
- Oracle函数实例:学习编写优化SQL语句(oracle函数例子)
- 求助!忘记Oracle账号密码(oracle账号密码忘记)
- Oracle函数存储过程:优化SQL语句常用技巧(oracle函数存储过程)
- “从Oracle 11g开始,一次掌握新的SQL语言特性”(oracle 11g方言)
- 解决Oracle共享磁盘挂载问题(oracle共享磁盘挂载)
- Oracle无需安装即可使用VBA(oracle免安装vba)
- Oracle数据库操作入门指南(oracle 写方法)
- Oracle 64位乱码问题如何快速解决(64位oracle 乱码)
- Oracle添加表锁保护数据免受破坏(oracle为表添加锁)
- Oracle协助消灭恶意病毒(oracle修复病毒)
- Oracle作业备份保障数据安全(oracle作业备份)
- Oracle优化之左关联技术实现快速数据获取(oracle优化左关联)
- 分析Oracle中名称结构的特点(oracle中的名称结构)
- Oracle中TRM管理数据库的标准方法(oracle中trm)
- 错误排查Oracle数据库1067错误症状及解决方案(oracle不能1067)
- Oracle实现上下层级结构的魅力(oracle上下层级)
- 通往Oracle OCA认证之路学习OCA教程(oracle oca教程)
- 解决Oracle 12570错误快速易行的操作方案(oracle 12570)
- Oracle数据库出现0604错误该如何处理(oracle 0604)