在MYSQL中的下面存储过程中,每当由于数据截断而出现警告时,它都会显示警告。但它没有ROLLBACK任何东西。 WARNING的EXIT处理程序完全被忽略。请帮忙。
DELIMITER $$
DROP PROCEDURE IF EXISTS `saveDetails` $$
CREATE DEFINER=`dbuser`@`%` PROCEDURE `saveDetails`(IN param_name VARCHAR(200))
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;
DECLARE EXIT HANDLER FOR SQLWARNING ROLLBACK;
START TRANSACTION;
UPDATE userDetails SET displaystatus = 2 where displaystatus = 1;
UPDATE userDetails SET displaystatus = 1 where displaystatus = 0;
UPDATE userDetails SET name = param_name;
COMMIT;
END $$
DELIMITER ;
我也试过以下版本,但这也行不通:
DELIMITER $$
DROP PROCEDURE IF EXISTS `saveDetails` $$
CREATE DEFINER=`dbuser`@`%` PROCEDURE `saveDetails`(IN param_name VARCHAR(200))
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING
BEGIN
ROLLBACK;
END;
START TRANSACTION;
UPDATE userDetails SET displaystatus = 2 where displaystatus = 1;
UPDATE userDetails SET displaystatus = 1 where displaystatus = 0;
UPDATE userDetails SET name = param_name;
COMMIT;
END $$
DELIMITER ;
答案 0 :(得分:0)
有一个非常简单的例子:
/*Table structure for table `mytable` */
DROP TABLE IF EXISTS `mytable`;
CREATE TABLE `mytable` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`value` INT(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB;
/*Data for the table `mytable` */
INSERT INTO `mytable`(`value`) VALUES (100);
/* Procedure structure for procedure `saveDetails` */
/*!50003 DROP PROCEDURE IF EXISTS `saveDetails` */;
DELIMITER $$
CREATE PROCEDURE `saveDetails`()
BEGIN
DECLARE EXIT HANDLER FOR SQLWARNING ROLLBACK;
START TRANSACTION;
UPDATE `mytable` SET `value` = 'A' WHERE `id` = 1;
COMMIT;
END$$
DELIMITER ;
一切都按预期工作:
mysql> SELECT `id`, `value` FROM `mytable`;
+----+-------+
| id | VALUE |
+----+-------+
| 1 | 100 |
+----+-------+
1 ROW IN SET (0.00 sec)
mysql> CALL saveDetails;
QUERY OK, 0 ROWS affected (0.02 sec)
mysql> SELECT `id`, `value` FROM `mytable`;
+----+-------+
| id | VALUE |
+----+-------+
| 1 | 100 |
+----+-------+
1 ROW IN SET (0.02 sec)
您可以显示:SHOW CREATE TABLE userDetails;
?