Как вызвать ошибку в функции MySQL - PullRequest
60 голосов
/ 21 января 2009

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

Ответы [ 6 ]

70 голосов
/ 06 августа 2012

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
25 голосов
/ 22 апреля 2010

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

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

5 голосов
/ 01 апреля 2009

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

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

2 голосов
/ 06 июля 2009

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

0 голосов
/ 21 января 2009

Вы должны определить обработчики исключений. Взгляните на http://dev.mysql.com/doc/refman/5.0/en/declare-handler.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...