MySQLÐĵÃ7-1-´æ´¢¹ý³Ì(ËÄ)
ÔÚ´æ´¢¹ý³ÌÖд¦ÀíSQLÓï¾ä¿ÉÄܵ¼ÖÂÒ»Ìõ´íÎóÏûÏ¢¡£ÀýÈ磬ÏòÒ»¸ö±íÖвåÈëеÄÐжøÖ÷¼üÖµÒѾ´æÔÚ£¬ÕâÌõINSERTÓï¾ä»áµ¼ÖÂÒ»¸ö³ö´íÏûÏ¢£¬²¢ÇÒMySQLÁ¢¼´Í£Ö¹¶Ô´æ´¢¹ý³ÌµÄ´¦Àí¡£Ã¿Ò»¸ö´íÎóÏûÏ¢¶¼ÓÐÒ»¸öΨһ´úÂëºÍÒ»¸öSQLSTATE´úÂë¡£ÀýÈ磬SQLSTATE 23000ÊôÓÚÈçϵijö´í´úÂ룺
Error 1022, "Can't write;duplicate£¨Öظ´£© key intable"
Error 1048, "Column cannot benull"
Error 1052, "Column is ambiguous£¨ÆçÒ壩"
Error 1062, "Duplicate entry forkey"
MySQLÊÖ²áµÄ¡°´íÎóÏûÏ¢ºÍ´úÂ롱һÕÂÖÐÁгöÁËËùÓеijö´íÏûÏ¢¼°ËüÃǸ÷×ԵĴúÂë¡£
ΪÁË·ÀÖ¹MySQLÔÚÒ»Ìõ´íÎóÏûÏ¢²úÉúʱ¾ÍÍ£Ö¹´¦Àí£¬ÐèҪʹÓõ½DECLAREhandlerÓï¾ä¡£¸ÃÓï¾äÓï¾äΪ´íÎó´úÂëÉùÃ÷ÁËÒ»¸öËùνµÄ´¦Àí³ÌÐò£¬ËüÖ¸Ã÷£º¶ÔÒ»ÌõSQLÓï¾äµÄ´¦ÀíÈç¹ûµ¼ÖÂÒ»Ìõ´íÎóÏûÏ¢£¬½«»á·¢Éúʲô¡£
DECLARE HANDLERÓï·¨¸ñʽΪ£º
DECLARE handler_type HANDLER FOR condition_value[,...]sp_statement
ÆäÖУ¬handler_typeΪ£º
Continue
| EXIT
| UNDO
condition_valueΪ£º
SQLstate [VALUE] sqlstate_value
www.2cto.com
| condition_name
| SQLwarning
| NOT FOUND
| SQLexception
|
mysql_error_code
˵Ã÷£º
¡ñ handler_type£º´¦Àí³ÌÐòµÄÀàÐÍ£¬Ö÷ÒªÓÐÈýÖÖ£ºCONTINUE¡¢EXITºÍUNDO¡£¶ÔCONTINUE´¦Àí³ÌÐò£¬MySQL²»Öжϴ洢¹ý³ÌµÄ´¦Àí¡£¶ÔÓÚEXIT´¦Àí³ÌÐò£¬µ±Ç° BEGIN...END¸´ºÏÓï¾äµÄÖ´Ðб»ÖÕÖ¹¡£UNDO´¦Àí³ÌÐòÀàÐÍÓï¾äÔÝʱ»¹²»±»Ö§³Ö¡£
¡ñ condition_value£º¸ø³öSQLSTATEµÄ´úÂë±íʾ¡£
condition_nameÊÇ´¦ÀíÌõ¼þµÄÃû³Æ£¬½ÓÏÂÀ´»á½²µ½¡£
SQLWARNINGÊǶÔËùÓÐÒÔ01¿ªÍ·µÄSQLSTATE´úÂëµÄËټǡ£NOT FOUNDÊǶÔËùÓÐÒÔ02¿ªÍ·µÄSQLSTATE´úÂëµÄËټǡ£SQLEXCEPTIONÊǶÔËùÓÐûÓб»SQLWARNING»òNOT FOUND²¶»ñµÄSQLSTATE´úÂëµÄËټǡ£µ±Óû§²»ÏëΪÿ¸ö¿ÉÄܵijö´íÏûÏ¢¶¼¶¨ÒåÒ»¸ö´¦Àí³ÌÐòʱ¿ÉÒÔʹÓÃÒÔÉÏÈýÖÖÐÎʽ¡£
mysql_error_codeÊǾßÌåµÄSQLSTATE´úÂë¡£³ýÁËSQLSTATEÖµ£¬MySQL´íÎó´úÂëÒ²±»Ö§³Ö£¬±íʾµÄÐÎʽΪ£ºERROR= 'xxxx'¡£
¡ñ sp_statement£º´¦Àí³ÌÐò¼¤»îʱ½«ÒªÖ´Ðе͝×÷¡£
Àý£º ´´½¨Ò»¸ö´æ´¢¹ý³Ì£¬ÏòXS±í²åÈëÒ»ÐÐÊý¾Ý£¨'081101', 'ÍõÃñ', '¼ÆËã»ú', 1, '1990-02-10',50 , NULL, NULL£©£¬ÒÑ֪ѧºÅ081101ÔÚXS±íÖÐÒÑ´æÔÚ¡£Èç¹û³öÏÖ´íÎ󣬳ÌÐò¼ÌÐø½øÐС£
USE XSCJ;
DELIMITER $$
CREATE PROCEDURE MY_INSERT ()
BEGIN
DECLARECONTINUE HANDLER FOR SQLSTATE '23000' SET @x2=1;
SET@x=2;
INSERTINTO XS VALUES('081101', 'ÍõÃñ', '¼ÆËã»ú', 1, '1990-02-10', 50 , NULL, NULL);
SET@x=3; www.2cto.com
END$$
DELIMITER ;
˵Ã÷£ºÔÚµ÷Óô洢¹ý³Ìºó£¬Î´Óöµ½´íÎóÏûϢʱ´¦Àí³ÌÐòδ±»¼¤»î£¬µ±Ö´ÐÐINSERTÓï¾ä³öÏÖ³ö´íÏûϢʱ£¬MySQL¼ì²éÊÇ·ñΪÕâ¸ö´íÎó´úÂ붨ÒåÁË´¦Àí³ÌÐò¡£Èç¹ûÓУ¬Ôò¼¤»î¸Ã´¦Àí³ÌÐò£¬±¾ÀýÖУ¬INSERTÓï¾äµ¼ÖµĴíÎóÏûÏ¢¸ÕºÃÊÇSQLSTATE´úÂëÖеÄÒ»Ìõ¡£½ÓÏÂÀ´Ö´Ðд¦Àí³ÌÐòµÄ¸½¼ÓÓï¾ä£¨SET @x2=1£©¡£´Ëºó£¬MySQL¼ì²é´¦Àí³ÌÐòµÄÀàÐÍ£¬ÕâÀïµÄÀàÐÍΪCONTINUE£¬Òò´Ë´æ´¢¹ý³Ì¼ÌÐø´¦Àí£¬½«Óû§±äÁ¿x¸³ÖµÎª3¡£Èç¹ûÕâÀïµÄINSERTÓï¾äÄܹ»Ö´ÐУ¬´¦Àí³ÌÐò½«²»±»¼¤»î£¬Óû§±äÁ¿x2½«²»±»¸³Öµ¡£
×¢Ò⣺²»ÄÜΪͬһ¸ö³ö´íÏûÏ¢ÔÚͬһ¸öBEGIN-ENDÓï¾ä¿éÖж¨ÒåÁ½¸ö»ò¸ü¶àµÄ´¦Àí³ÌÐò¡£
ΪÁËÌá¸ß¿É¶ÁÐÔ£¬¿ÉÒÔʹÓÃDECLARE CONDITIONÓï¾äΪһ¸öSQLSTATE»ò³ö´í´úÂ붨ÒåÒ»¸öÃû×Ö£¬²¢ÇÒ¿ÉÒÔÔÚ´¦Àí³ÌÐòÖÐʹÓÃÕâ¸öÃû×Ö¡£
DECLARE CONDITIONÓï·¨¸ñʽΪ£º
DECLARE condition_name CONDITION FORcondition_value
ÆäÖУ¬condition_value£º
SQLSTATE [VALUE] sqlstate_value
| mysql_error_code
˵Ã÷£ºcondition_nameÊÇ´¦ÀíÌõ¼þµÄÃû³Æ£¬condition_valueΪҪ¶¨Òå±ðÃûµÄSQLSTATE»ò³ö´í´úÂë¡£
Àý£º ÐÞ¸ÄÉÏÀýÖеĴ洢¹ý³Ì£¬½«SQLSTATE '23000' ¶¨Òå³ÉNON_UNIQUE£¬²¢ÔÚ´¦Àí³ÌÐòÖÐʹÓÃÕâ¸öÃû³Æ¡£³ÌÐòƬ¶ÎΪ£º
BEGIN
DECLARE NON_UNIQUE CONDITION FOR SQLSTATE '23000';
DECLARE CONTINUE HANDLER FOR NON_UNIQUE SET @x2=1;
SET @x=2;
INSERT INTO XS VALUES('081101', 'ÍõÃñ', '¼ÆËã»ú', 1, '1990-02-10', 50 , NULL, NULL);
SET @x=3; www.2cto.com
END;
12. Óαê
Ò»ÌõSELECT...INTOÓï¾ä·µ»ØµÄÊÇ´øÓÐÖµµÄÒ»ÐУ¬ÕâÑù¿ÉÒÔ°ÑÊý¾Ý¶ÁÈ¡µ½´æ´¢¹ý³ÌÖС£µ«Êdz£¹æµÄSELECTÓï¾ä·µ»ØµÄÊǶàÐÐÊý¾Ý£¬Èç¹ûÒª´¦ÀíËüÐèÒªÒýÈëÓαêÕâÒ»¸ÅÄî¡£MySQLÖ§³Ö¼òµ¥µÄÓαꡣÔÚMySQLÖУ¬ÓαêÒ»¶¨ÒªÔÚ´æ´¢¹ý³Ì»òº¯ÊýÖÐʹÓ㬲»Äܵ¥¶ÀÔÚ²éѯÖÐʹÓá£
ʹÓÃÒ»¸öÓαêÐèÒªÓõ½4ÌõÌØÊâµÄÓï¾ä£ºDECLARE CURSOR£¨ÉùÃ÷Óα꣩¡¢OPEN CURSOR£¨´ò¿ªÓα꣩¡¢FETCH CURSOR£¨¶ÁÈ¡Óα꣩ºÍCLOSE CURSOR£¨¹Ø±ÕÓα꣩¡£
Èç¹ûʹÓÃÁËDECLARE CURSORÓï¾äÉùÃ÷ÁËÒ»¸öÓα꣬ÕâÑù¾Í°ÑËüÁ¬½Óµ½ÁËÒ»¸öÓÉSELECTÓï¾ä·µ»ØµÄ½á¹û¼¯ÖС£Ê¹ÓÃOPEN CORSORÓï¾ä´ò¿ªÕâ¸öÓÎ