MySQL е малко по-различен звяр, когато става въпрос за неговия процедурен скриптов език. Въпреки че понякога може да изглежда като остарял модел за създаване на бизнес логика в хранилището на данни, има начини за внедряване на съвременни най-добри практики.

По принцип искате да избегнете бизнес логиката на спагетите в стека. Въпреки това, има моменти, когато от съображения за сигурност или стабилност е важно да има някои „критични“ функции в съхранените процедури. Не ги избягвайте просто защото не ги харесвате, особено когато имате нужда от тях по архитектурни причини. Уверете се, че сте проверили дали те не са твърде тясно свързани с бизнес логиката, която може да се промени с промяната на изискванията на вашето приложение.

Нека започнем, като кажем, че в MySQL няма традиционни изрази TRY CATCH, но има Условия, които са почти синоним на Изключения. Условията съдържат както код, така и описание.

Вместо да опаковате целия си код в блок try catch, вие основно добавяте това, което се нарича манипулатор към вашата процедура. Обикновено бихте искали да спрете изпълнението и в MySQL, което се управлява чрез exit handler. В зависимост от случая на използване може да искате да върнете назад или да регистрирате събитието, когато се извика манипулаторът.

Ето примерен скелет на процедура, който има манипулатор за изход за SQLEXCEPTION.

DELIMITER $$
CREATE PROCEDURE my_procedure(IN search_var VARCHAR(255))

BEGIN
DECLARE exit handler for SQLEXCEPTION
 BEGIN
  GET DIAGNOSTICS CONDITION 1 @sqlstate = RETURNED_SQLSTATE, 
   @errno = MYSQL_ERRNO, @text = MESSAGE_TEXT;
  SET @full_error = CONCAT("ERROR ", @errno, " (", @sqlstate, "): ", @text);
  SELECT @full_error;
 END;
SELECT * FROM fake_table WHERE id = search_var;
END$$
DELIMITER ;

Ако стартирате CALL my_procedure('1234'), ще видите номера на грешката, sql кода на състоянието и четливо описание. Има и други „действия и условия“, които можете да проучите, за да създадете вашите манипулатори.

Ако искате да създадете свои собствени изключения, можете да го направите, като промените SQLSTATE чрез ключовата дума SIGNAL.

IF(C != 1) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Order No not found in orders table';
END IF;

Забавлявайте се със съхранените процедури и ме уведомете, ако съм пропуснал нещо!