日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql handlers,2 Handlers

發(fā)布時間:2025/3/15 数据库 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql handlers,2 Handlers 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在撰寫stored routines時,MySQL提供一種很特別的宣告語法,你可以使用它宣告「handler」,handler用來處理stored routines中可能會發(fā)生的錯誤,讓你可以針對發(fā)生的錯誤執(zhí)行必要的補救工作,也可以防止stored routines因為發(fā)生錯誤而中止。首先要特別注意宣告「handler」的位置:

Handler是用來處理錯誤用的,所以在宣告的時候,要設(shè)定處理的錯誤種類和決定后續(xù)的流程。下列是宣告handler的語法:

Handler的宣告包含發(fā)生的錯誤時要執(zhí)行的敘述,如果有多個敘述時,就一定要使用「BEGIN-END」區(qū)塊,把這些敘述放在區(qū)塊中:

下列是一個新增部門資料的procedur,呼叫它的時候要提供部門編號、名稱與地點三個參數(shù),這個procedure會使用你的參數(shù)幫你新增一筆紀錄到「cmdev.dept」表格中,新增后會顯示「Success!」的訊息:

下列是呼叫「cmdev.test_handler」procedure的范例:

因為在「cmdev.dept」表格的定義中,部門編號「deptno」欄位設(shè)定為primary key,所以它的欄位值是不可以重復(fù)的。所以如果再執(zhí)行一次上列呼叫「cmdev.test_handler」procedure的范例:

在執(zhí)行一個stored routine的過程中,如果發(fā)生任何錯誤,MySQL都會停止繼續(xù)執(zhí)行,再傳回錯誤編號與錯誤訊息,告訴呼叫的人發(fā)生了什么狀況:

撰寫stored routines處理資料庫的工作,除了之前已經(jīng)討論過的許多好處外,使用handler來處理錯誤,讓執(zhí)行工作的過程可以更加順利,也是使用stored routines的主要原因。

下列的范例同樣是提供新增部門資料功能的procedure,不過為了希望發(fā)生索引值重復(fù)的錯誤時,不要因為錯誤而中斷執(zhí)行的工作,也不要傳回錯誤編號與錯誤訊息,而是自己顯示一個錯誤訊息,清楚的告訴使用者發(fā)生了什么狀況。這樣的需求就必須在procedure中加入handler的宣告。索引值重復(fù)的SQL state是「23000」,這個編號會使用在handler的宣告中:

加入handler宣告的stored routines,在執(zhí)行過程中如果沒有發(fā)生任何問題,handler是沒有任何作用的,stored routines會正常的執(zhí)行完所有的敘述:

呼叫加入handler的宣告的「cmdev.test_handler2」,如果沒有發(fā)生任何問題,在新增部門紀錄后會顯示「Success!」的訊息:

如果在執(zhí)行過程中發(fā)生任何問題了,MySQL會使用發(fā)生的錯誤編號,與你在handler宣告中指定的錯誤執(zhí)行比對的工作,如果一樣的話,接下來就交由handler來處理這個錯誤,MySQL就不會中斷執(zhí)行與回傳錯誤:

呼叫加入handler的宣告的「cmdev.test_handler2」時,如果指定的部門編號在資料表中已經(jīng)存在,執(zhí)行新增的敘述時就會發(fā)生發(fā)生索引值重復(fù)的錯誤。這種錯誤的SQL state是「23000」,MySQL錯誤編號是「1062」:

在宣告handler時,除了指定handler要處理哪一種錯誤外,還要根據(jù)自己的需求,決定處理錯誤以后的后續(xù)流程:

一個宣告為「EXIT」的handler,在執(zhí)行完handler包含的敘述以后,會離開handler所在的區(qū)塊;而宣告為「CONTINUE」的handler,執(zhí)行的流程會像這樣:

上列新增部門資料的procedure范例,根據(jù)新增紀錄的結(jié)果,會顯示「Success!」或「Error!」兩種結(jié)果。如果希望不論新增紀錄成功或發(fā)生問題,都要把結(jié)果儲存到下列的「cmdev.deptlog」表格中: 欄位名稱 型態(tài) NULL 索引 預(yù)設(shè)值 其它資訊 說明

logno bigint(20) NO PRI NULL auto_increment 紀錄編號

logdt timestamp NO CURRENT_TIMESTAMP 日期時間

message varchar(64) YES NULL 訊息

下列的范例使用「CONTINUE HANDLER」來執(zhí)行新增部門紀錄資料,而且會記錄執(zhí)行后的結(jié)果:

呼叫「test_handler3」procedure后,如果沒有發(fā)生任何問題,除了新增部門紀錄外,還會新增一筆成功的訊息到「cmdev.deptlop」表格:

如果新增部門紀錄時發(fā)生錯誤,「CONTINUE HANDLER」會把「v_message」變數(shù)值設(shè)定為「Error!」,然后再新增一筆錯誤的訊息到「cmdev.deptlop」表格:

下列的范例是呼叫「test_handler3」procedure后,紀錄在「cmdev.deptlop」表格中的結(jié)果:

索引值重復(fù)與不允許NULL值的錯誤,都是屬于SQL state中的「23000」,如果你想要分別處理這兩種錯誤的話,你可以針對每一種錯誤,宣告不同的handler來處理,不過在指定錯誤時,就要使用MySQL錯誤編號:

下列的范例是呼叫「test_handler4」procedure后,紀錄在「cmdev.deptlop」表格中的結(jié)果:

在宣告handler時指定的錯誤情況有下列幾種:

總結(jié)

以上是生活随笔為你收集整理的mysql handlers,2 Handlers的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。