web-dev-qa-db-ja.com

MySQL関数内でエラーを発生させる方法

MySQL関数を作成しましたが、パラメーターに渡された値が無効な場合にエラーを発生させたいと思います。 MySQL関数内でエラーを発生させる私のオプションは何ですか?

61
Dónal

MySQL 5.5では、他の言語の例外と同様のシグナルが導入されています。

http://dev.mysql.com/doc/refman/5.5/en/signal.html

たとえば、mysqlコマンドラインクライアントの場合:

mysql> SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Custom error';
ERROR 1644 (45000): Custom error
73
Austin Hyde

実際には、3つの答えすべての組み合わせです。存在しないプロシージャを呼び出してエラーを発生させ、生成したエラーをキャッチする終了ハンドラーを宣言します。削除する行に外部キーIDが設定されている場合、SQLSTATE 42000(手順は存在しません)を使用して削除前にエラーをスローする例を次に示します。

DROP PROCEDURE IF EXISTS decount_test;

DELIMITER //

CREATE DEFINER = 'root'@'localhost' PROCEDURE decount_test ( p_id bigint )
DETERMINISTIC MODIFIES SQL DATA
BEGIN
  DECLARE EXIT HANDLER FOR SQLSTATE '42000'
    SELECT 'Invoiced barcodes may not have accounting removed.';
  IF (SELECT invoice_id 
       FROM accounted_barcodes
       WHERE id = p_id
    ) THEN
    CALL raise_error;
 END IF;
 DELETE FROM accounted_barcodes WHERE id = p_id;
END //

DELIMITER ;

出力:

call decount_test(123456);
+----------------------------------------------------+
| Invoiced barcodes may not have accounting removed. |
+----------------------------------------------------+
| Invoiced barcodes may not have accounting removed. | 
+----------------------------------------------------+
25
Ryan M

なぜVARCHARを宣言されたINTEGER変数に格納しないのですか?

DELIMITER $$ DROP FUNCTION IF EXISTS `raise_error` $$
CREATE FUNCTION `raise_error`(MESSAGE VARCHAR(255)) 
RETURNS INTEGER DETERMINISTIC BEGIN
  DECLARE ERROR INTEGER;
  set ERROR := MESSAGE;
  RETURN 0;
END $$ DELIMITER ;
-- set @foo := raise_error('something failed'); -- or within a query

エラーメッセージ:

不正な整数値:行1の列「エラー」の「何かが失敗しました」

それは完璧ではありませんが、かなり説明的なメッセージを提供し、拡張DLLを書く必要はありません。

8
user645280

MySQL 5では、存在しないストアドプロシージャを呼び出す(CALL raise_error)か、クエリに無効な値を渡す(NULLをNOT NULL制約フィールドに含める)ことでエラーを発生させることができます。 MySQL関数内からエラーを発生させることに関するRoland Boumanの興味深い投稿を次に示します。

http://rpbouman.blogspot.com/2005/11/using-udf-to-raise-errors-from-inside.html

5

無効な数の引数を使用して既存の関数を呼び出すこともできます。

2

例外ハンドラを定義する必要があります。 http://dev.mysql.com/doc/refman/5.0/en/declare-handler.html をご覧ください

0