小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

MySql存儲過程

 紫火神兵 2015-05-14

在游標(biāo)里面我們有簡要的介紹了一個NOT FOUND這個條件處理(錯誤、異常處理)的情況,條件處理涉及到兩個語句,一個是DECLARE...CONDITION,另一個是DECLARE....HANDLER。在游標(biāo)的例子中是使用了一個DECLARE....HANDLER。先來看看DECLARE....HANDLER。

1、DECLARE....HANDLER語句

這個語句用于但數(shù)據(jù)庫出現(xiàn)某種情況的時候(condition,大部分指發(fā)生某種錯誤時),來定義具體的處理辦法(handler);所以這里涉及到包括:a、就是個什么情況 b、如何處理它;下面是其格式

  1. DECLARE handler_action HANDLER  
  2.     FOR condition_value [, condition_value] ...  
  3.     statement  
  4.   
  5. handler_action:  
  6.     CONTINUE  
  7.   | EXIT  
  8.   | UNDO  
  9.   
  10. condition_value:  
  11.     mysql_error_code  
  12.   | SQLSTATE [VALUE] sqlstate_value  
  13.   | condition_name  
  14.   | SQLWARNING  
  15.   | NOT FOUND  
  16.   | SQLEXCEPTION  
這里面需要注意幾點(diǎn):

      a、condition_value [,condition_value],這個的話說明可以包括多種情況(方括弧表示可選的),也就是一個handler可以定義成針對多種情況進(jìn)行相應(yīng)的操作;另外condition_value可以包括的值有上面列出來的6種:

                1、mysql_error_code,這個表示mysql的錯誤代碼,錯誤代碼是一個數(shù)字,完成是由mysql自己定義的,這個值可以參考mysql數(shù)據(jù)庫錯誤代碼及信息。

                2、SQLSTATE [VALUE] sqlstate_value,這個同錯誤代碼類似形成一一對應(yīng)的關(guān)系,它是一個5個字符組成的字符串,關(guān)鍵的地方是它從ANSI SQL和ODBC這些標(biāo)準(zhǔn)中引用過來的,因此更加標(biāo)準(zhǔn)化,而不像上面的error_code完全是mysql自己定義給自己用的,這個和第一個類似也可以參考mysql數(shù)據(jù)庫錯誤代碼及信息

                3、condtion_name,這個是條件名稱,它使用DECLARE...CONDITION語句來定義,這個后面我們會介紹如何定義自己的condition_name。

                4、SQLWARNING,表示SQLTATE中的字符串以‘01’起始的那些錯誤,比如Error: 1311 SQLSTATE: 01000 (ER_SP_UNINIT_VAR)

                5、NOT FOUND,表示SQLTATE中的字符串以‘02’起始的那些錯誤,比如Error: 1329 SQLSTATE: 02000 (ER_SP_FETCH_NO_DATA),其實(shí)這個錯誤就是用在我們介紹游標(biāo)的那個問題所出現(xiàn)的情況,也就是沒有fetch到記錄,也就是我們游標(biāo)到記錄的尾巴了的情況。

                6、SQLEXCEPTION,表示SQLSTATE中的字符串不是以'00'、'01'、'02' 起始的那些錯誤,這里'00'起始的SQLSTATE其實(shí)表示的是成功執(zhí)行而不是錯誤,另外兩個就是上面的4和5的兩種情況。

上面的6種情況其實(shí)可以分為兩類,一類就是比較明確的處理,就是對指定的錯誤情況進(jìn)行處理,包括1、2、3這三種方式;另一類是對對應(yīng)類型的錯誤的處理,就是對某一群錯誤的處理,包括4、5、6這三種方式。這個是介紹了condition_value。另外還要注意的一個內(nèi)容是MySQL在默認(rèn)情況下(也就是我們沒有定義處理錯誤的方法-handler)自己的錯誤處理機(jī)制:1、對于SQLWARNING和NOT FOUND的處理方法就是無視錯誤繼續(xù)執(zhí)行,所以在游標(biāo)的例子里面如果我們沒有對repeat的條件判斷的那個值做個no_more_products=1的handler來處理,那么循環(huán)就會一直下去。2、對于SQLEXCEPTION的話,其默認(rèn)的處理方法是在出現(xiàn)錯誤的地方就終止掉了。

      b、statement,這個比較簡單就是當(dāng)出現(xiàn)某種條件/錯誤時,我們要執(zhí)行的語句,可以是簡單的如 SET  var = value這樣的簡單的語句,也可以是復(fù)雜的多行的語句,多行的話可以使用BEGIN  .....  END這里把語句包括在里面(這個好比delphi里面的情況,注意到我們的存儲過程也是多行的,所以也要BEGIN .... END)。

      c、handler_action,這個表示當(dāng)執(zhí)行完上面的statement后,希望執(zhí)行怎樣的動作,這里包括CONTINUE、EXIT、UNDO,表示繼續(xù)、退出、撤銷(暫時不支持)。這邊就是兩種動作,其實(shí)這兩種動作在上面也說過了,CONTINUE就是一個是SQLWARNING和NOT FOUND的默認(rèn)處理方法,而EXIT就是SQLEXCEPTION的默認(rèn)處理方法。

來看個簡單的例子,這里創(chuàng)建一個對SQLSTATE的代碼為'23000'的錯誤(重復(fù)的主鍵)進(jìn)行處理的HANDLER,每次發(fā)生時我們對變量@x進(jìn)行增加1:

  1. DELIMITER $$  
  2.   
  3. DROP PROCEDURE IF EXISTS `test`.`ConditionProc` $$  
  4. CREATE PROCEDURE `test`.`ConditionProc` ()  
  5. BEGIN  
  6. DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x = @x+1;  
  7. INSERT INTO products values(1,default,default,default,default,default);  
  8. INSERT INTO products values(1,default,default,default,default,default);  
  9. SELECT @x;  
  10. END $$  
  11.   
  12. DELIMITER ;  
代碼比較簡單,當(dāng)然這里我們需要對數(shù)據(jù)庫進(jìn)行一點(diǎn)修改,把除了主鍵外其他的字段設(shè)置了默認(rèn)值,方便測試

測試比較簡單,這里我們數(shù)據(jù)庫里面本身就有記錄了,然后在Qurey browser中先輸入

SET @x = 0;

然后調(diào)用存儲過程下面是結(jié)果:


通過結(jié)果我們知道出現(xiàn)了兩次插入的記錄同原有的記錄出現(xiàn)主鍵重復(fù)的情況。當(dāng)然這個是由下面這個代碼觸發(fā)的。

INSERT INTO products values(1,default,default,default,default,default);

2、DECLARE...CONDITION語句

這個語句其實(shí)是為了讓我們的錯誤條件更加的清晰明了化的,對于上面的情況,像SQLSTATE '23000'這種表示是一種很不直觀的方法,要通過相應(yīng)的文檔去對應(yīng),閱讀起來比較不方便。而DECLARE....CONDITION可以對條件定義相對應(yīng)的名稱,看個例子就清楚了:

  1. DECLARE duplicate_key CONDITION FOR SQLSTATE '23000';  
  2. DECLARE CONTINUE HANDLER FOR duplicate_key  
  3.   BEGIN  
  4.     -- body of handler   
  5.   END;  
當(dāng)然在上面的例子我們沒有用到BEGIN....END,我們只有一行SET @x=@x+1;這里我們用duplicate_key這個條件名稱來對應(yīng)到SQLSTATE '23000'上面,這樣查看起來更加的直觀。這你duplicate_key就是我們上面介紹DECLARE....HANDLER時候的那個condition_name。


    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多