0

我知道 mysql 5.5 允许使用SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Error: ...';引发用户定义的错误。如果将其放在某些表中,此错误将停止INSERT操作。BEFORE INSERT TRIGGER并且它也很方便PDO捕获PDOException并输出错误信息(),即MESSAGE_TEXT定义在SIGNAL SQLSTATE.
但是,我租用的服务器上的mysql版本是mysql 5.1。而且我想知道如何使用SIGNAL SQLSTATEMENTmysql 5.5 中的功能引发用户定义的错误。

  1. insertbefore insert触发时中断操作
  2. 可以被PDO

我发现了一些关于类似问题的主题,并且我尝试了这些:

  • 调用一个不存在的过程

    调用“sp_raise_error”;

  • 使用函数抛出错误

https://blogs.oracle.com/svetasmirnova/entry/how_to_raise_error_in

两者都抓不住PDO。那么有什么解决办法呢?(我在 MySQL5.5 上测试过)

4

1 回答 1

0

如果您SIGNAL SQLSTATE在较低版本的 MySQL(如 5.1)中使用,您将收到1064错误消息。因此,为了像 dos 一样使用该功能SIGNAL SQLSTATE,您可以尝试以下步骤。

1.创建名为“TBL_DUMMY”的辅助表

CREATE TABLE IF NOT EXISTS `TBL_DUMMY`  
(
    `error` VARCHAR(256)
);

2. 在 TBL_DUMMY 上创建 BEFORE INSERT 触发器

delimiter $$  
CREATE TRIGGER `TRIG_BI_DUMMY` BEFORE INSERT ON `TBL_DUMMY`  
    FOR EACH ROW
BEGIN  
    SET NEW = NEW.`error`;
END $$  

3. 创建名为“SP_RAISE_ERROR”的过程

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 $$

4. 用法

只需执行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; 

之后,您可以从外部程序中的消息中提取错误文本。

于 2014-01-23T12:56:24.607 回答