Я создал функцию 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
Вы также можете вызвать существующую функцию с недопустимым числом аргументов.
Ответ 6
Вы должны определить обработчики исключений. Взгляните на http://dev.mysql.com/doc/refman/5.0/en/declare-handler.html