Oracle基礎(chǔ)多條sql執(zhí)行在中間的語句出現(xiàn)錯誤時(shí)的控制方式
多條sql執(zhí)行時(shí)如果在中間的語句出現(xiàn)錯誤,后續(xù)會不會直接執(zhí)行,如何進(jìn)行設(shè)定,以及其他數(shù)據(jù)庫諸如Mysql是如何對應(yīng)的,這篇文章將會進(jìn)行簡單的整理和說明。
環(huán)境準(zhǔn)備
使用Oracle的精簡版創(chuàng)建docker方式的demo環(huán)境,詳細(xì)可參看:
多行語句的正常執(zhí)行
對上篇文章創(chuàng)建的兩個(gè)字段的學(xué)生信息表,正常添加三條數(shù)據(jù),詳細(xì)如下:
# 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 #
多行語句中間出錯時(shí)的缺省動作
問題:
三行insert語句,如果中間的一行出錯,缺省的狀況下第三行會不會被插入進(jìn)去?
我們將第二條insert語句的主鍵故意設(shè)定重復(fù),然后進(jìn)行確認(rèn)第三條數(shù)據(jù)是否會進(jìn)行插入即可。
# 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中通過什么來對其進(jìn)行控制呢?
WHENEVER SQLERROR
答案很簡單,在oracle中通過WHENEVER SQLERROR來進(jìn)行控制。
WHENEVER SQLERROR {EXIT [SUCCESS | FAILURE | WARNING | n | variable | :BindVariable] [COMMIT | ROLLBACK] | CONTINUE [COMMIT | ROLLBACK | NONE]}
WHENEVER SQLERROR EXIT
添加此行設(shè)定,即會在失敗的時(shí)候立即推出,接下來我們進(jìn)行確認(rèn):
# 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中類似的機(jī)制
mysql中使用source是否提供相關(guān)的類似機(jī)制的問題中,最終引入了Oracle此項(xiàng)功能在mysql中引入的建議,詳細(xì)請參看:
所以目前這只是一個(gè)sqlplus端的強(qiáng)化功能,并非標(biāo)準(zhǔn),不同數(shù)據(jù)庫需要確認(rèn)相應(yīng)的功能是否存在。
小結(jié)
Oracle中使用WHENEVER SQLERROR進(jìn)行出錯控制是否繼續(xù),本文給出的例子非常簡單,詳細(xì)功能的使用可根據(jù)文中列出的Usage進(jìn)行自行驗(yàn)證和探索。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
相關(guān)文章
Oracle 數(shù)據(jù)庫特殊查詢總結(jié)
這篇文章主要介紹了Oracle 數(shù)據(jù)庫特殊查詢總結(jié)的相關(guān)資料,非常不錯,具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08
Oracle EBS工具選項(xiàng):關(guān)閉其他表單修改方法
這篇文章主要介紹了Oracle EBS工具選項(xiàng)關(guān)閉其他表單修改方法,包括通過SQL語句永久打開或關(guān)閉這個(gè)選項(xiàng)的方法,需要的朋友可以了解下。2017-09-09
Ubuntu?22.04或20.04安裝Oracle?SQL?Developer的圖文教程
Oracle?SQL?Developer?是一個(gè)免費(fèi)平臺,為開發(fā)人員提供用于開發(fā)和管理?Oracle?數(shù)據(jù)庫的集成開發(fā)環(huán)境,這篇文章主要介紹了Ubuntu?22.04或20.04安裝Oracle?SQL?Developer圖文教程,需要的朋友可以參考下2024-08-08
Oracle數(shù)據(jù)庫opatch補(bǔ)丁操作流程
這篇文章主要介紹了Oracle數(shù)據(jù)庫opatch補(bǔ)丁操作流程的相關(guān)資料,本文從升級前準(zhǔn)備工作到安裝補(bǔ)丁操作整理過程都介紹的非常詳細(xì),需要的朋友可以參考下2016-10-10
Oracle數(shù)據(jù)庫部分遷至閃存存儲的實(shí)現(xiàn)方法
下面小編就為大家分享一篇Oracle數(shù)據(jù)庫部分遷至閃存存儲的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12

