1. 语法:

 

DECLARE handler_action HANDLER
    FOR condition_value [, condition_value] ...
    statement

handler_action:
    CONTINUE
  | EXIT
  | UNDO

condition_value:
    mysql_error_code
  | SQLSTATE [VALUE] sqlstate_value
  | condition_name
  | SQLWARNING
  | NOT FOUND
  | SQLEXCEPTION

 If one of these conditions occurs, the specified statement executes. statement can be a simple statement such as SETvar_name = value, or a compound statement written using BEGIN and END.

http://dev.mysql.com/doc/refman/5.0/en/declare-handler.html

2. 实例

实例1:

DROP TABLE IF EXISTS tb1;
CREATE TABLE tb1(
field1 INT NOT NULL COMMENT 'id',
field2 INT COMMENT 'value',
PRIMARY KEY(field1)
)ENGINE=INNODB DEFAULT CHARSET=UTF8 COMMENT ='临时测试表'

DROP PROCEDURE IF EXISTS sp_do_insert;
CREATE PROCEDURE sp_do_insert(
   IN in_param1    int,
   IN in_param2    int,
   OUT out_status  tinyint
)
BEGIN
   DECLARE CONTINUE HANDLER FOR 1062 SET out_status = 1;

   SET out_status = 0;

   INSERT INTO tb1(field1, field2)
   VALUES (in_param1, in_param2); 
     IF out_status=1 THEN
        select in_param1, in_param2;
     END IF;
END;

CALL sp_do_insert(2,200,@out);
SELECT @out;

实例2:begin 。。。end块异常处理

DROP TABLE IF EXISTS tb1;

CREATE TABLE tb1(

field1 INT NOT NULL COMMENT 'id',

field2 INT COMMENT 'value',

PRIMARY KEY(field1)

)ENGINE=INNODB DEFAULT CHARSET=UTF8 COMMENT ='临时测试表'

 

DROP PROCEDURE IF EXISTS sp_do_insert;

CREATE PROCEDURE sp_do_insert(

   IN in_param1    int,

   IN in_param2    int,

   IN in_param3    int,

   IN in_param4    int,

         OUT out_status1  tinyint,

         OUT out_status2  tinyint

)

BEGIN

         BEGIN

   DECLARE CONTINUE HANDLER FOR 1062 SET out_status1 = 1;

   SET out_status1 = 0;

   INSERT INTO tb1(field1, field2)VALUES (in_param1, in_param2);

   IF out_status1=1 THEN

        select in_param1, in_param2;

                                     select '1062--------11' AS 'first result';

   END IF;

  END;

         BEGIN

         DECLARE CONTINUE HANDLER FOR 1062 SET out_status2 = 1;

   SET out_status2 = 0;

   INSERT INTO tb1(field1, field2)VALUES (in_param3, in_param4);

   IF out_status2=1 THEN

        select in_param3, in_param4;

                                     select '1062--------22' AS 'secord result';

   END IF;

         END;

END;

 

CALL sp_do_insert(1,100,2,200,@out1,@out2);

SELECT @out1,@out2;

 

select * from tb1;

 

3. server error code

http://dev.mysql.com/doc/refman/5.5/en/error-messages-server.html 

常见errorcode

  •  Error: 1172 SQLSTATE: 42000 (ER_TOO_MANY_ROWS)

    Message: Result consisted of more than one row

  •  Error: 1062 SQLSTATE: 23000 (ER_DUP_ENTRY)

    Message: Duplicate entry '%s' for key %d

  •  Error: 1329 SQLSTATE: 02000 (ER_SP_FETCH_NO_DATA)

    Message: No data - zero rows fetched, selected, or processed

 

 

 

 

 

posted on 2014-12-10 16:41  一天不进步,就是退步  阅读(369)  评论(0编辑  收藏  举报