Oracle數據庫多條sql執(zhí)行語句出現錯誤時的控制方式
多條sql執(zhí)行時如果在中間的語句出現錯誤,后續(xù)會不會直接執(zhí)行,如何進行設定,以及其他數據庫諸如Mysql是如何對應的,這篇文章將會進行簡單的整理和說明。環(huán)境準備使用Oracle的精簡...
多條sql執(zhí)行時如果在中間的語句出現錯誤,后續(xù)會不會直接執(zhí)行,如何進行設定,以及其他數據庫諸如MySQL是如何對應的,這篇文章將會進行簡單的整理和說明。
環(huán)境準備
使用Oracle的精簡版創(chuàng)建docker方式的demo環(huán)境。
多行語句的正常執(zhí)行
對上篇文章創(chuàng)建的兩個字段的學生信息表,正常添加三條數據,詳細如下:
# 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
#
結果非常清晰地表明是會繼續(xù)執(zhí)行的,在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則和缺省方式下的行為一致,出錯仍然繼續(xù)執(zhí)行
# 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進行出錯控制是否繼續(xù),本文給出的例子非常簡單,詳細功能的使用可根據文中列出的Usage進行自行驗證和探索。
總結
以上就是Oracle數據庫多條sql執(zhí)行語句出現錯誤時的控制方式的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值。
Oracle數據庫基礎:程序中調用sqlplus的方式
通過sqlplus可以連接數據庫根據用戶權限進行數據或者設定操作,但是需要交互操作并返回結果,這篇文章介紹一下如何在程序中使用sqlplus。環(huán)境準備使用Oracle的精簡版創(chuàng)建docker...
oracle數據庫通過sqlplus連接的幾種方式介紹
分享一篇關于Oracle通過sqlplus連接數據庫的方式,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...
oracle數據庫常用分析函數與聚合函數的用法
今天小編就為大家分享一篇關于oracle數據庫常用分析函數與聚合函數的用法,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧。應之前的...
oracle數據庫連續(xù)相同數據的統(tǒng)計方法
今天小編就為大家分享一篇關于Oracle連續(xù)相同數據的統(tǒng)計,內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧。今天復習一下之前用到的連續(xù)相同數...
關于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創(chuàng)建DDL和DML操作方法
文章主要介紹了使用sqlplus創(chuàng)建DDL和DML操作方法,需要的朋友可以參考下。在window進入命令行模式敲sqlplus就會...
關于PHP往mysql數據庫中批量插入數據實例教程
文章主要給大家介紹了關于php往mysql中批量插入數據的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起看看吧...