亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Oracle > 正文

Oracle查詢sql錯誤信息的控制和定位

2024-08-29 14:01:26
字體:
來源:轉載
供稿:網友

在sqlplus中執行的sql出錯之后應該如何處理和對應,多行sql語句或者存儲過程的信息如何進行錯誤定位,這篇文章將結合實例進行簡單地說明。

環境準備

使用Oracle的精簡版創建docker方式的demo環境

如何進行錯誤定位

場景:

假如有3行insert的sql語句,中間一行出錯之后,后續繼續執行的情況下,如何定位到第二行?

dbms_utility.format_error_backtrace

通過使用dbms_utility.format_error_backtrace可以得到ERROR at line xxx:的信息,這對我們較為有用,我們接下來進行確認

oracle@e871d42341c0:~$ sqlplus system/abcd1234@XE <<EOF> SET SERVEROUTPUT ON> 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;> exec dbms_output.put_line(dbms_utility.format_error_backtrace);> EOFSQL*Plus: Release 11.2.0.2.0 Production on Sun Oct 21 13:06:07 2018Copyright (c) 1982, 2011, Oracle. All rights reserved.Connected to:Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit ProductionSQL> SQL> Name    Null?  Type ----------------------------------------- -------- ---------------------------- STUID    NOT NULL NUMBER(4) STUNAME     VARCHAR2(50)SQL> 2 rows deleted.SQL> no rows selectedSQL> 1 row created.SQL> insert into student values (1001, 'liumiao')*ERROR at line 1:ORA-00001: unique constraint (SYSTEM.SYS_C007024) violatedSQL> 1 row created.SQL>    STUID STUNAME---------- --------------------------------------------------   1001 liumiaocn   1003 michaelSQL> Commit complete.SQL> PL/SQL procedure successfully completed.SQL> Disconnected from Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Productionoracle@e871d42341c0:~$ 

可以看到,報錯的時候提示了行號,但是行號是1,這是因為這種寫法以一行為單位,自然是如此,如果是單個多行的存儲過程,將會更加清晰。

ERROR at line 1:ORA-00001: unique constraint (SYSTEM.SYS_C007024) violated

所以我們將這個例子進行改造,三行insert的sql放到文件之中,然后在使用dbms_utility.format_error_backtrace來進行確認

oracle@e871d42341c0:~$ cat /tmp/sqltest1.sql desc studentdelete 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;oracle@e871d42341c0:~$

然后在嘗試一下是否能夠確認行號,會發現仍然不能精確定位:

 

oracle@e871d42341c0:~$ sqlplus system/abcd1234@XE <<EOF> SET SERVEROUTPUT ON> @/tmp/sqltest1.sql> exec dbms_output.put_line(dbms_utility.format_error_backtrace);> EOFSQL*Plus: Release 11.2.0.2.0 Production on Sun Oct 21 13:08:27 2018Copyright (c) 1982, 2011, Oracle. All rights reserved.Connected to:Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit ProductionSQL> SQL> Name    Null?  Type ----------------------------------------- -------- ---------------------------- STUID    NOT NULL NUMBER(4) STUNAME     VARCHAR2(50)2 rows deleted.no rows selected1 row created.insert into student values (1001, 'liumiao')*ERROR at line 1:ORA-00001: unique constraint (SYSTEM.SYS_C007024) violated1 row created.   STUID STUNAME---------- --------------------------------------------------   1001 liumiaocn   1003 michaelCommit complete.SQL> PL/SQL procedure successfully completed.SQL> Disconnected from Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Productionoracle@e871d42341c0:~$ 

因為dbms_utility.format_error_backtrace更多的場景是在于存儲過程的錯誤定位,接下來我們使用一個簡單的存儲過程例子來進行確認錯誤行號定位, 先看一個正常的存儲過程,把上面的內容稍微修改一下:

oracle@e871d42341c0:~$ cat /tmp/addstudent.sql create or replace PROCEDURE addstudentsISstudent_count number;BEGINdelete from student;select count(*) into student_count from student;dbms_output.put('sql set count before :');dbms_output.put_line(student_count);insert into student values (1001, 'liumiaocn');insert into student values (1002, 'liumiao');insert into student values (1003, 'michael');select count(*) into student_count from student;dbms_output.put('sql set count after :');dbms_output.put_line(student_count);END;/exec addstudents();oracle@e871d42341c0:~$

結果執行信息如下

oracle@e871d42341c0:~$ sqlplus system/liumiao123 <<EOFset serveroutput on;@/tmp/addstudent.sql EOFSQL*Plus: Release 11.2.0.2.0 Production on Mon Oct 22 04:42:11 2018Copyright (c) 1982, 2011, Oracle. All rights reserved.Connected to:Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit ProductionSQL> SQL> Procedure created.sql set count before :0sql set count after :3PL/SQL procedure successfully completed.SQL> Disconnected from Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Productionoracle@e871d42341c0:~$ 

接下來我們修改一下內容,使得第二行主鍵重復

oracle@e871d42341c0:~$ cat /tmp/addstudent.sqlcreate or replace PROCEDURE addstudentsISstudent_count number;BEGINdelete from student;select count(*) into student_count from student;dbms_output.put('sql set count before :');dbms_output.put_line(student_count);insert into student values (1001, 'liumiaocn');insert into student values (1001, 'liumiao');insert into student values (1003, 'michael');select count(*) into student_count from student;dbms_output.put('sql set count after :');dbms_output.put_line(student_count);END;/exec addstudents();oracle@e871d42341c0:~$ 

再次執行,自然會出錯,但是可以看到,正確報出了所在行數,這是procedure的機制提示的信息

oracle@e871d42341c0:~$ sqlplus system/liumiao123 <<EOFset serveroutput on;@/tmp/addstudent.sql EOFSQL*Plus: Release 11.2.0.2.0 Production on Mon Oct 22 04:44:25 2018Copyright (c) 1982, 2011, Oracle. All rights reserved.Connected to:Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit ProductionSQL> SQL> Procedure created.sql set count before :0BEGIN addstudents(); END;*ERROR at line 1:ORA-00001: unique constraint (SYSTEM.SYS_C007024) violatedORA-06512: at "SYSTEM.ADDSTUDENTS", line 10ORA-06512: at line 1SQL> Disconnected from Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Productionoracle@e871d42341c0:~$

可以看到,ORA-06512: at “SYSTEM.ADDSTUDENTS”, line 10的信息就是我們期待的信息,提示出在這個存儲過程的第10行執行出現問題,而實際可以使用dbms_utility.format_error_backtrace結合exception給出更為清晰地方式,比如:

oracle@e871d42341c0:~$ cat /tmp/addstudent.sql create or replace PROCEDURE addstudentsISstudent_count number;BEGINdelete from student;select count(*) into student_count from student;dbms_output.put('sql set count before :');dbms_output.put_line(student_count);insert into student values (1001, 'liumiaocn');insert into student values (1001, 'liumiao');insert into student values (1003, 'michael');select count(*) into student_count from student;dbms_output.put('sql set count after :');dbms_output.put_line(student_count);exceptionwhen others thendbms_output.put('exception happend with line info : ');dbms_output.put_line(dbms_utility.format_error_backtrace);END;/exec addstudents();oracle@e871d42341c0:~$

執行結果確認:

oracle@e871d42341c0:~$ sqlplus system/liumiao123 <<EOFset serveroutput on;@/tmp/addstudent.sql EOFSQL*Plus: Release 11.2.0.2.0 Production on Mon Oct 22 04:49:27 2018Copyright (c) 1982, 2011, Oracle. All rights reserved.Connected to:Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit ProductionSQL> SQL> Procedure created.sql set count before :0exception happend with line info : ORA-06512: at "SYSTEM.ADDSTUDENTS", line 10PL/SQL procedure successfully completed.SQL> Disconnected from Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Productionoracle@e871d42341c0:~$ 

這樣則可以看出能夠比較清晰地進行錯誤的定位了,但是由于功能受限,所以實際使用場景仍然較為有限,但是定位存儲過程的信息則可以使用dbms_utility.format_error_backtrace等進行確認。

小結

多行sql執行定位可以考慮拆成單行來確認,而存儲過程則可結合format_error_backtrace等進行確認以提供問題出現的所在行號。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到oracle教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品短视频| 92福利视频午夜1000合集在线观看| 午夜伦理精品一区| 国产成人极品视频| 亚洲精品视频在线观看视频| 亚洲欧美日韩精品久久| 国产午夜精品一区二区三区| 国产免费一区二区三区香蕉精| 亚洲免费高清视频| 亚洲日本中文字幕免费在线不卡| 日韩精品免费一线在线观看| 久久好看免费视频| 久久夜色精品国产| 精品女厕一区二区三区| 97视频国产在线| 欧美午夜xxx| 91高清视频免费| 欧美一二三视频| 中文字幕在线观看亚洲| 国产成人精品最新| 在线免费观看羞羞视频一区二区| 久久成人精品视频| 欧美成人精品不卡视频在线观看| 中文字幕日韩欧美在线| www国产精品com| 国产精品福利久久久| 国产精品福利无圣光在线一区| 国产一区av在线| 亚洲视频在线观看| 亚洲人成亚洲人成在线观看| 久久久久亚洲精品国产| 久久久99免费视频| 欧美性xxxxx极品| 欧美久久久精品| 日韩精品极品在线观看| 日韩欧美国产网站| 国产丝袜一区二区| 亚洲性夜色噜噜噜7777| 91视频免费在线| 亚洲综合在线做性| 久久久免费在线观看| 欧美国产日韩视频| 日本成人在线视频网址| 久久精品最新地址| 欧美性猛交xxxx免费看| 91精品视频播放| 午夜精品99久久免费| 国产激情久久久久| 亚洲国产精品成人av| 另类色图亚洲色图| 粉嫩老牛aⅴ一区二区三区| 精品二区三区线观看| 免费91麻豆精品国产自产在线观看| 欧美激情网友自拍| 奇米影视亚洲狠狠色| 欧美久久精品午夜青青大伊人| 久久成人人人人精品欧| 亚洲一区二区久久久| 久久亚洲精品毛片| 亚洲第一福利网| 久久精品99久久久香蕉| 永久免费看mv网站入口亚洲| 深夜精品寂寞黄网站在线观看| 黑人与娇小精品av专区| 91精品国产色综合久久不卡98口| 亚洲精品资源在线| 中文字幕亚洲精品| 亚洲欧洲黄色网| 色yeye香蕉凹凸一区二区av| 成人疯狂猛交xxx| 91亚洲国产精品| 欧美性极品xxxx做受| 国产九九精品视频| 中文字幕日韩精品有码视频| 性欧美激情精品| 欧美成人性色生活仑片| 久久av在线看| 亚洲视频第一页| 欧美日本黄视频| 日韩在线中文字幕| 国产精品∨欧美精品v日韩精品| 麻豆乱码国产一区二区三区| 亚洲免费av片| 日韩亚洲国产中文字幕| 一区二区三区视频免费在线观看| 这里只有精品视频在线| 欧美性猛交xxxx富婆弯腰| 国产成人精品a视频一区www| 欧美日韩国产在线看| 欧美成人免费全部观看天天性色| 欧美插天视频在线播放| 国产精品日韩av| 久久亚洲影音av资源网| 精品中文字幕在线| 欧洲成人在线视频| 中文字幕欧美日韩| 亚洲二区在线播放视频| 精品毛片网大全| 国产精品亚洲精品| 成人精品在线观看| 国产精品高潮呻吟久久av黑人| 日韩精品免费综合视频在线播放| 成人欧美一区二区三区在线湿哒哒| 国内精久久久久久久久久人| 国产精品久久网| 日韩二区三区在线| 国产精品美女视频网站| 91黄色8090| 久久久人成影片一区二区三区| 欧美最猛性xxxxx免费| 国产精品男人爽免费视频1| 高潮白浆女日韩av免费看| 国产不卡一区二区在线播放| 亚洲欧美999| 亚洲国产精品成人一区二区| 国产+成+人+亚洲欧洲| 狠狠色噜噜狠狠狠狠97| 亚洲直播在线一区| 国产精品扒开腿做爽爽爽的视频| 国产精品人人做人人爽| 日韩高清a**址| 国产精品色悠悠| 668精品在线视频| 97色在线观看免费视频| 亚洲福利视频二区| 日韩国产欧美精品一区二区三区| 欧美一区二区大胆人体摄影专业网站| 国产一区二区三区三区在线观看| 亚洲精品国产精品久久清纯直播| 国产丝袜一区二区| 亚洲全黄一级网站| 国产精品ⅴa在线观看h| 久久综合伊人77777尤物| 欧美激情啊啊啊| 国产亚洲精品久久久久动| 国产精品久久久久久久久久久久| 91免费高清视频| 国产精品video| 久久深夜福利免费观看| 国产精品网站入口| 中文字幕视频一区二区在线有码| 亚洲欧美一区二区三区四区| 欧美午夜影院在线视频| 欧美激情在线观看视频| 懂色av影视一区二区三区| 成人国产亚洲精品a区天堂华泰| 激情久久av一区av二区av三区| 夜夜躁日日躁狠狠久久88av| 国产一区二区三区欧美| 日韩h在线观看| 久久免费少妇高潮久久精品99| 精品亚洲精品福利线在观看| 亚洲综合精品一区二区| 久久综合伊人77777| 亚洲大尺度美女在线| 日韩有码在线电影| 久久久久久尹人网香蕉| 国产精品网站大全| 国产一区二区三区在线视频| 欧美老少做受xxxx高潮| 亚洲欧洲在线免费| 欧美日韩一区免费| 亚洲最新av在线网站| 午夜精品久久久久久久99热|