9 MySQL定義條件和處理程式

2021-10-24 16:03:17 字數 3743 閱讀 3630

在程式的執行過程中可能會遇到問題,此時我們可以通過定義條件和處理程式來事先定義這些問題。

定義條件是指事先定義程式執行過程中遇到的問題,處理程式定義了在遇到這些問題時應當採取的處理方式和解決辦法,保證儲存過程和函式在遇到警告或錯誤時能繼續執行,從而增強程式處理問題的能力,避免程式出現異常被停止執行。

下面將詳細講解如何定義條件和處理程式。

mysql 中可以使用 declare 關鍵字來定義條件。其基本語法如下:

declare condition_name condition for condition_value

condition value:

sqlstate [

value

] sqlstate_value | mysql_error_code

其中:

例 1

下面定義「error 1146 (42s02)」這個錯誤,名稱為 can_not_find。 可以用兩種不同的方法來定義,**如下:

//方法一:使用sqlstate_value

declare can_not_find condition for sqlstate '42s02'

;

//方法二:使用 mysql_error_code

declare can_not_find condition for

1146

;

mysql 中可以使用declare關鍵字來定義處理程式。其基本語法如下:

declare handler_type handler

for condition_value[..

.] sp_statement

handler_type:

continue

|exit

| undo

condition_value:

sqlstate [

value

] sqlstate_value | condition_name | sqlwarning |

not found | sqlexception | mysql_error_code

其中,handler_type 引數指明錯誤的處理方式,該引數有 3 個取值。這 3 個取值分別是 continue、exit 和 undo。

注意:通常情況下,執行過程中遇到錯誤應該立刻停止執行下面的語句,並且撤回前面的操作。但是,mysql 中現在還不能支援 undo 操作。因此,遇到錯誤時最好執行 exit 操作。如果事先能夠**錯誤型別,並且進行相應的處理,那麼可以執行 continue 操作。

引數指明錯誤型別,該引數有 6 個取值:

sp_statement 引數為程式語句段,表示在遇到定義的錯誤時,需要執行的一些儲存過程或函式。

例 2

//方法一:捕獲 sqlstate_value

declare

continue

handler

for sqlstate '42s02'

set@info

='can not find'

;

//方法二:捕獲 mysql_error_code

declare

continue

handler

for1146

set@info

='can not find'

;

//方法三:先定義條件,然後呼叫

declare can_not_find condition for

1146

;declare

continue

handler

for can_not_find set

@info

='can not find'

;

//方法四:使用 sqlwarning

declare

exit

handler

for sqlwarning set

@info

='error'

;

//方法五:使用 not found

declare

exit

handler

fornot found set

@info

='can not find'

;

//方法六:使用 sqlexception

declare

exit

handler

for sqlexception set

@info

='error'

;

上述**是 6 種定義處理程式的方法。

例 3

定義條件和處理順序,具體的執行過程如下:

mysql>

create

table t8(s1 int

,primary

key(s1));

query ok,

0rows affected (

0.07 sec)

mysql>

delimiter

//mysql>

create

procedure handlerdemo()-

>

begin

->

declare

continue

handler

for sqlstate '23000'

set@x2=1

;->

set@x=1

;->

insert

into t8 values(1

);->

set@x=2

;->

insert

into t8 values(1

);->

set@x=3

;->

end//

mysql>

delimiter

;mysql>

call handlerdemo(

);

mysql>

select@x;

+------+|@x

|+------+|3

|+------+

上述**中,@x 是乙個使用者變數,執行結果 @x 等於 3,這表明 mysql 執行到程式的末尾。

如果declare continue handler for sqlstate '23000' set @x2=1;這一行不存在,第二個 insert 因 primary key 約束而失敗之後,mysql 可能已經採取 exit 策略,且 select @x 可能已經返回 2。

注意:@x 表示使用者變數,使用 set

語句為其賦值,使用者變數與連線有關,乙個客戶端定義的變數不能被其他客戶端所使用,當客戶端退出時,該客戶端連線的所有變數將自動釋放。

9 MySQL的資料排序

1 單個欄位的排序order by desc降序 0 9,a z,a z mysql select prod name,prod price from products order by prod price prod name prod price carrots 2.50 tnt 1 stick...

9 mysql臨時表 複製表

mysql臨時表在我們儲存一些臨時資料時非常有用的,臨時表只有當前連線可見,當關閉連線時,mysql會自動刪除表並釋放表空間。1 建立臨時表 create temporary table table name 當使用show tables命令顯示資料表列表時,將無法看到臨時表。2 刪除臨時表 預設情...

9 MySQL中的連線查詢

mysql中的連線查詢 連線查詢 連線查詢 將多張表進行記錄的連線 按照某個指定的條件進行資料的拼接 最終結果 記錄數可能有變化,字段數一定會增加 至少兩張表的合併 連線查詢的意義 在使用者檢視資料的時候需要顯示的資料來自多張表.連線查詢 join 使用方式 左表 join 右表 連線查詢分類 sq...