1. 程式人生 > 資料庫 >Oracle基礎多條sql執行在中間的語句出現錯誤時的控制方式

Oracle基礎多條sql執行在中間的語句出現錯誤時的控制方式

多條sql執行時如果在中間的語句出現錯誤,後續會不會直接執行,如何進行設定,以及其他資料庫諸如Mysql是如何對應的,這篇文章將會進行簡單的整理和說明。

環境準備

使用Oracle的精簡版建立docker方式的demo環境,詳細可參看:

  • https://www.jb51.net/article/153533.htm

多行語句的正常執行

對上篇文章建立的兩個欄位的學生資訊表,正常新增三條資料,詳細如下:

# 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,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,'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,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,'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,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進行自行驗證和探索。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對我們的支援。如果你想了解更多相關內容請檢視下面相關連結