MySQL関数を作成しましたが、パラメーターに渡された値が無効な場合にエラーを発生させたいと思います。 MySQL関数内でエラーを発生させる私のオプションは何ですか?
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
実際には、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. |
+----------------------------------------------------+
なぜ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を書く必要はありません。
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
無効な数の引数を使用して既存の関数を呼び出すこともできます。
例外ハンドラを定義する必要があります。 http://dev.mysql.com/doc/refman/5.0/en/declare-handler.html をご覧ください