我知道mysql 5.5允许使用SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Error: ...';
引发用户定义的错误。如果将INSERT
操作放在某些表的BEFORE INSERT TRIGGER
上,则此错误将停止。并且方便PDO
捕获PDOException
并输出MESSAGE_TEXT
中定义的errorinfo(),即SIGNAL SQLSTATE
。
但是,我租用的服务器上的mysql版本是mysql 5.1。我想知道如何使用mysql 5.5中的SIGNAL SQLSTATEMENT
等功能引发用户定义的错误。
insert
触发器before insert
操作
PDO
我找到了一些类似问题的主题,我试过这些:左
调用一个非常规程序
调用`sp_raise_error`;
使用函数抛出错误
https://blogs.oracle.com/svetasmirnova/entry/how_to_raise_error_in
PDO
无法捕获这两者。那么什么是解决方案? (我在MySQL5.5上测试过)
答案 0 :(得分:0)
如果在较低版本的MySQL(如5.1)中使用SIGNAL SQLSTATE
,则会出现1064
错误。因此,为了使用像SIGNAL SQLSTATE
这样的函数,您可以尝试以下步骤。
CREATE TABLE IF NOT EXISTS `TBL_DUMMY`
(
`error` VARCHAR(256)
);
delimiter $$
CREATE TRIGGER `TRIG_BI_DUMMY` BEFORE INSERT ON `TBL_DUMMY`
FOR EACH ROW
BEGIN
SET NEW = NEW.`error`;
END $$
delimiter $$
CREATE PROCEDURE `SP_RAISE_ERROR` (IN P_ERROR VARCHAR(256))
BEGIN
DECLARE V_ERROR VARCHAR(300);
SET V_ERROR := CONCAT('[ERROR: ', P_ERROR, ']');
INSERT INTO `TBL_DUMMY` VALUES (V_ERROR);
END $$
只需执行SP_RAISE_ERROR
而不是SIGNAL SQLSTATE
。例如,CALL SP_RAISE_ERROR ('Password incorrect.')
将抛出异常,消息为:
0 15:40:23 CALL SP_RAISE_ERROR ('Password incorrect.') Error Code: 1231. Variable 'new' can't be set to the value of '[ERROR: Password incorrect.]'.
你可以在程序中使用它:
IF V_ID IS NOT NULL AND V_ID <> P_ID THEN
CALL `SP_RAISE_ERROR` ('Title duplicated.');
END IF;
之后,您可以从外部程序中的消息中提取错误文本。