Oracle數(shù)據(jù)庫多條sql執(zhí)行語句出現(xiàn)錯誤時的控制方式
多條sql執(zhí)行時如果在中間的語句出現(xiàn)錯誤,后續(xù)會不會直接執(zhí)行,如何進行設(shè)定,以及其他數(shù)據(jù)庫諸如Mysql是如何對應(yīng)的,這篇文章將會進行簡單的整理和說明。環(huán)境準備使用Oracle的精簡...
多條sql執(zhí)行時如果在中間的語句出現(xiàn)錯誤,后續(xù)會不會直接執(zhí)行,如何進行設(shè)定,以及其他數(shù)據(jù)庫諸如MySQL是如何對應(yīng)的,這篇文章將會進行簡單的整理和說明。
環(huán)境準備
使用Oracle的精簡版創(chuàng)建docker方式的demo環(huán)境。
多行語句的正常執(zhí)行
對上篇文章創(chuàng)建的兩個字段的學生信息表,正常添加三條數(shù)據(jù),詳細如下:
- # 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語句的主鍵故意設(shè)定重復,然后進行確認第三條數(shù)據(jù)是否會進行插入即可。
- # 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
- #
結(jié)果非常清晰地表明是會繼續(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
添加此行設(shè)定,即會在失敗的時候立即推出,接下來我們進行確認:
- # 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是否提供相關(guān)的類似機制的問題中,最終引入了Oracle此項功能在mysql中引入的建議,詳細請參看:
https://bugs.mysql.com/bug.php?id=73177所以目前這只是一個sqlplus端的強化功能,并非標準,不同數(shù)據(jù)庫需要確認相應(yīng)的功能是否存在。
小結(jié)
Oracle中使用WHENEVER SQLERROR進行出錯控制是否繼續(xù),本文給出的例子非常簡單,詳細功能的使用可根據(jù)文中列出的Usage進行自行驗證和探索。
總結(jié)
以上就是Oracle數(shù)據(jù)庫多條sql執(zhí)行語句出現(xiàn)錯誤時的控制方式的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值。
- Oracle數(shù)據(jù)庫基礎(chǔ):程序中調(diào)用sqlplus的方式
- oracle數(shù)據(jù)庫通過sqlplus連接的幾種方式介紹
- oracle數(shù)據(jù)庫常用分析函數(shù)與聚合函數(shù)的用法
- oracle數(shù)據(jù)庫連續(xù)相同數(shù)據(jù)的統(tǒng)計方法
- 關(guān)于oracle數(shù)據(jù)庫全角數(shù)字轉(zhuǎn)換半角數(shù)字方法
- 詳解SQL Server 2012數(shù)據(jù)庫備份與還原的教程
- 利用SQL Server Management Studio(SSMS)復制數(shù)據(jù)庫
- SQL Server數(shù)據(jù)庫中Substring函數(shù)的用法實例詳解
- MsSql數(shù)據(jù)庫使用SQL plus創(chuàng)建DDL和DML操作方法
- 關(guān)于PHP往mysql數(shù)據(jù)庫中批量插入數(shù)據(jù)實例教程
  - Oracle數(shù)據(jù)庫基礎(chǔ):程序中調(diào)用sqlplus的方式- 通過sqlplus可以連接數(shù)據(jù)庫根據(jù)用戶權(quán)限進行數(shù)據(jù)或者設(shè)定操作,但是需要交互操作并返回結(jié)果,這篇文章介紹一下如何在程序中使用sqlplus。環(huán)境準備使用Oracle的精簡版創(chuàng)建docker... 
  - oracle數(shù)據(jù)庫通過sqlplus連接的幾種方式介紹- 分享一篇關(guān)于Oracle通過sqlplus連接數(shù)據(jù)庫的方式,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧... 
  - oracle數(shù)據(jù)庫常用分析函數(shù)與聚合函數(shù)的用法- 今天小編就為大家分享一篇關(guān)于oracle數(shù)據(jù)庫常用分析函數(shù)與聚合函數(shù)的用法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧。應(yīng)之前的... 
  - oracle數(shù)據(jù)庫連續(xù)相同數(shù)據(jù)的統(tǒng)計方法- 今天小編就為大家分享一篇關(guān)于Oracle連續(xù)相同數(shù)據(jù)的統(tǒng)計,內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧。今天復習一下之前用到的連續(xù)相同數(shù)... 
  - 關(guān)于oracle數(shù)據(jù)庫全角數(shù)字轉(zhuǎn)換半角數(shù)字方法- 今天小編就為大家分享一篇關(guān)于Oracle全角數(shù)字轉(zhuǎn)換半角數(shù)字,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧數(shù)據(jù)庫表 test 字段 id n... 
  - 詳解SQL Server 2012數(shù)據(jù)庫備份與還原的教程- 文章主要為大家詳細介紹了SQL Server2012數(shù)據(jù)庫備份和還原的教程,選擇要備份的數(shù)據(jù)庫“accountInfo”,點擊鼠標右鍵 → 任務(wù) → 備份。... 
  - 利用SQL Server Management Studio(SSMS)復制數(shù)據(jù)庫- 文章主要為大家詳細介紹了如何利用SQL Server Management Studio復制數(shù)據(jù)庫,具有一定的參考價值,感興趣的小伙伴們可以參考一下。... 
  - SQL Server數(shù)據(jù)庫中Substring函數(shù)的用法實例詳解- substring操作的字符串,開始截取的位置,返回的字符個數(shù),本文通過簡單實例給大家介紹了SqlServer數(shù)據(jù)庫中Substring函數(shù)的用法,感興趣的朋友一起看看吧... 
  - MsSql數(shù)據(jù)庫使用SQL plus創(chuàng)建DDL和DML操作方法- 文章主要介紹了使用sqlplus創(chuàng)建DDL和DML操作方法,需要的朋友可以參考下。在window進入命令行模式敲sqlplus就會... 
  - 關(guān)于PHP往mysql數(shù)據(jù)庫中批量插入數(shù)據(jù)實例教程- 文章主要給大家介紹了關(guān)于php往mysql中批量插入數(shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起看看吧... 

