Как поднять ошибку в функции MySQL

Я создал функцию MySQL и хотел бы поднять ошибку, если значения, переданные для параметров, недействительны. Каковы мои возможности для повышения ошибки в функции MySQL?

Ответ 1

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

Ответ 2

На самом деле это комбинация всех трех ответов. Вы вызываете несуществующую процедуру для повышения ошибки, а затем объявляете обработчик выхода, который улавливает полученную вами ошибку. Вот пример, используя 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. | 
+----------------------------------------------------+

Ответ 3

Почему бы просто не сохранить 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-расширения.

Ответ 4

В MySQL 5 вы можете вызвать ошибку, вызвав хранимую процедуру, которая не существует (CALL raise_error), или передать недопустимое значение запросу (например, null в поле NOT NULL contrained). Вот интересная статья Роланда Боумана о том, как создавать ошибки в рамках функции MySQL:

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

Ответ 5

Вы также можете вызвать существующую функцию с недопустимым числом аргументов.