0

SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Error: ...';mysql 5.5 では、ユーザー定義エラーを発生させるために使用できることを知っています。また、一部のテーブルINSERTに配置されている場合、このエラーは操作を停止します。また、 で定義されている errorinfo()をキャッチして出力するBEFORE INSERT TRIGGERのも便利です。 しかし、レンタルしているサーバーのmysqlのバージョンはmysql 5.1です。また、mysql 5.5のような機能を使用してユーザー定義エラーを発生させる方法を知りたいです。PDOPDOExceptionMESSAGE_TEXTSIGNAL SQLSTATE
SIGNAL SQLSTATEMENT

  1. トリガーinsert中に操作を中断するbefore 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 SQLSTATEMySQL の下位バージョン (5.1 など) で使用すると、1064エラーが発生します。したがって、機能を使用するには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 に答える