我正在尝试在MySQL中创建 try-catch类型存储过程:
DELIMITER $$
DROP PROCEDURE IF EXISTS `SQL_TRY_CATCH` $$
CREATE PROCEDURE `SQL_TRY_CATCH`()
BEGIN
DECLARE `_rollback` BOOL DEFAULT 0;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET `_rollback` = 1;
START TRANSACTION;
UPDATE `devices` SET
`cabinet` = '46',
`name` = 'Test Device',
`type` = 'Test Type',
`u_size` = '27',
`service_tag` = '35sdf35',
`port_1` = '10.10.1.1',
`drac` = '10.10.1.2',
`notes` = 'Notes 1',
`hd_info` = 'HD Info 2'
WHERE `id`='45';
IF `_rollback` THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
END $$
DELIMITER ;
但是,每次运行时,我都会 :
错误#1064您的SQL语法出错;检查手册 对应于您的MySQL服务器版本,以获得正确的语法 在'
附近使用
DELIMITER $$
DROP PROCEDURE IF EXISTS `SQL_TRY_CATCH` $$
CREATE PROCEDUR
'在第1行
有人能指出我正在做错的方向吗?
感谢。
答案 0 :(得分:1)
你的脚本中有太多分号?尝试在SQL_TRY_CATCH()
和BEGIN
以及START TRANSACTION
之后删除分号,并为函数RETURNS VARCHAR
或RETURNS INT
添加返回类型或您想要的任何内容
DELIMITER $$
DROP FUNCTION IF EXISTS `SQL_TRY_CATCH`$$
CREATE FUNCTION `SQL_TRY_CATCH`() RETURNS INT
BEGIN
DECLARE `_rollback` BOOL DEFAULT 0;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET `_rollback` = 1;
START TRANSACTION;
'.$sql.';
IF `_rollback` THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
END$$
DELIMITER ;
<强>更新强>
DELIMITER $$
DROP PROCEDURE IF EXISTS `SQL_TRY_CATCH`;$$
CREATE PROCEDURE `SQL_TRY_CATCH`()
BEGIN
DECLARE `_rollback` BOOL DEFAULT 0;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET `_rollback` = 1;
START TRANSACTION;
UPDATE entities SET `slug`='servers' WHERE `slug`='devices';
IF `_rollback` THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
END$$
DELIMITER ;