久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Oracle基礎多條sql執行在中間的語句出現錯誤時怎么辦

157次閱讀
沒有評論

共計 4706 個字符,預計需要花費 12 分鐘才能閱讀完成。

這篇文章給大家分享的是有關 Oracle 基礎多條 sql 執行在中間的語句出現錯誤時怎么辦的內容。丸趣 TV 小編覺得挺實用的,因此分享給大家做個參考,一起跟隨丸趣 TV 小編過來看看吧。

環境準備

使用 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 基礎多條 sql 執行在中間的語句出現錯誤時怎么辦”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-04發表,共計4706字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 凤庆县| 陈巴尔虎旗| 呼伦贝尔市| 涟源市| 庆元县| 永康市| 法库县| 湘乡市| 内乡县| 抚松县| 兴仁县| 邹平县| 高平市| 始兴县| 南通市| 广元市| 汕头市| 勐海县| 克东县| 天峨县| 克拉玛依市| 株洲县| 通渭县| 孙吴县| 通山县| 余庆县| 祥云县| 肃南| 兴和县| 繁昌县| 灵石县| 华亭县| 禄劝| 称多县| 临泽县| 罗田县| 阳江市| 长岭县| 宜州市| 清河县| 贵定县|