例:
test表,字段id,test 类型int id自增DELIMITER $$DROP PROCEDURE IF EXISTS `test`.`test` $$
CREATE PROCEDURE `test`.`test` (in dat int)
BEGIN
insert into test(test) values(dat);
END $$DELIMITER ;call test('asdasd');
肯定报错,dat是数字型的.现在我想实现,在调用这个存储过程的时候如果出错,就往err表中查三个数据,一个是数据库返回的错误,一个是记录传入的参数
以及错误时间.我看了可以用这个,可是没有实例,请赐教
DECLARE {CONTINUE | EXIT} HANDLER FOR {SQLSTATE sqlstate_code| MySQL error code| condition_name} handler_actions

解决方案 »

  1.   

    这个自己控制比较好。靠MYSQL自身的异常也没有啥用处。我就从来不用它的异常。
      

  2.   

     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
    这个语句指定每个可以处理一个或多个条件的处理程序。如果产生一个或多个条件,指定的语句被执行。 对一个CONTINUE处理程序,当前子程序的执行在执行处理程序语句之后继续。对于EXIT处理程序,当前BEGIN...END复合语句的执行被终止。UNDO 处理程序类型语句还不被支持。·         SQLWARNING是对所有以01开头的SQLSTATE代码的速记。·         NOT FOUND是对所有以02开头的SQLSTATE代码的速记。·         SQLEXCEPTION是对所有没有被SQLWARNING或NOT FOUND捕获的SQLSTATE代码的速记。除了SQLSTATE值,MySQL错误代码也不被支持。例如: mysql> CREATE TABLE test.t (s1 int,primary key (s1));
    Query OK, 0 rows affected (0.00 sec)
     
    mysql> delimiter //
     
    mysql> CREATE PROCEDURE handlerdemo ()
        -> BEGIN
        ->   DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1;
        ->   SET @x = 1;
        ->   INSERT INTO test.t VALUES (1);
        ->   SET @x = 2;
        ->   INSERT INTO test.t VALUES (1);
        ->   SET @x = 3;
        -> END;
        -> //
    Query OK, 0 rows affected (0.00 sec)
     
    mysql> CALL handlerdemo()//
    Query OK, 0 rows affected (0.00 sec)
     
    mysql> SELECT @x//
        +------+
        | @x   |
        +------+
        | 3    |
        +------+
        1 row in set (0.00 sec)
    注意到,@x是3,这表明MySQL被执行到程序的末尾。如果DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1; 这一行不在,第二个INSERT因PRIMARY KEY强制而失败之后,MySQL可能已经采取默认(EXIT)路径,并且SELECT @x可能已经返回2