Oracle数据库多条sql执行语句出现错误时的控制方式
多条sql执行时如果在中间的语句出现错误,后续会不会直接执行,如何进行设定,以及其他数据库诸如Mysql是如何对应的,这篇文章将会进行简单的整理和说明。环境准备使用Oracle的精简...
多条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进行自行验证和探索。
总结
以上就是Oracle数据库多条sql执行语句出现错误时的控制方式的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值。
-
Oracle数据库基础:程序中调用sqlplus的方式
通过sqlplus可以连接数据库根据用户权限进行数据或者设定操作,但是需要交互操作并返回结果,这篇文章介绍一下如何在程序中使用sqlplus。环境准备使用Oracle的精简版创建docker...
-
oracle数据库通过sqlplus连接的几种方式介绍
分享一篇关于Oracle通过sqlplus连接数据库的方式,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...
-
oracle数据库常用分析函数与聚合函数的用法
今天小编就为大家分享一篇关于oracle数据库常用分析函数与聚合函数的用法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧。应之前的...
-
oracle数据库连续相同数据的统计方法
今天小编就为大家分享一篇关于Oracle连续相同数据的统计,内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧。今天复习一下之前用到的连续相同数...
-
关于oracle数据库全角数字转换半角数字方法
今天小编就为大家分享一篇关于Oracle全角数字转换半角数字,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧数据库表 test 字段 id n...
-
详解SQL Server 2012数据库备份与还原的教程
文章主要为大家详细介绍了SQL Server2012数据库备份和还原的教程,选择要备份的数据库“accountInfo”,点击鼠标右键 → 任务 → 备份。...
-
利用SQL Server Management Studio(SSMS)复制数据库
文章主要为大家详细介绍了如何利用SQL Server Management Studio复制数据库,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。...
-
SQL Server数据库中Substring函数的用法实例详解
substring操作的字符串,开始截取的位置,返回的字符个数,本文通过简单实例给大家介绍了SqlServer数据库中Substring函数的用法,感兴趣的朋友一起看看吧...
-
MsSql数据库使用SQL plus创建DDL和DML操作方法
文章主要介绍了使用sqlplus创建DDL和DML操作方法,需要的朋友可以参考下。在window进入命令行模式敲sqlplus就会...
-
关于PHP往mysql数据库中批量插入数据实例教程
文章主要给大家介绍了关于php往mysql中批量插入数据的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧...