MySQL: Обработка исключений


* Следующий код демонстрирует обработку исключений в MySQL
* Процедура test1 генерирует ошибку и отваливается по ошибке
* Процедура test2 перехватывает ошибку и продолжает выполнение

DROP TABLE IF EXISTS test;
CREATE TABLE test (
   name VARCHAR(30)
);

# Процедура 1, которая генерит исключительную ситуацию

DROP PROCEDURE IF EXISTS test1;

delimiter $$
CREATE PROCEDURE test1 (n INTEGER)
BEGIN
    DECLARE err INTEGER DEFAULT FALSE;
    DECLARE x INT DEFAULT 5;
    DECLARE EXIT HANDLER FOR SQLSTATE '45000' SET err = TRUE;
    WHILE x > 0 DO
        IF x=n THEN
            SIGNAL SQLSTATE '45000' SET message_text='x=3';
        END IF;
        SET x = x - 1;
    END WHILE;
    INSERT INTO test (name) VALUES (CONCAT('test1 ',n));
END$$
delimiter ;

# Процедура 2, которая перехватывает исключительную ситуацию

DROP PROCEDURE IF EXISTS test2;

delimiter $$
CREATE PROCEDURE test2 ()
BEGIN
    DECLARE err INTEGER DEFAULT FALSE;
    DECLARE y INT DEFAULT 1;
    DECLARE CONTINUE HANDLER FOR SQLSTATE '45000' SET err = TRUE;
    WHILE y <= 3 DO
        SET @n = y;
        CALL test1(@n);
        SET y = y + 1;
    END WHILE;
    INSERT INTO test (name) VALUES (CONCAT('test2'));
END$$
delimiter ;

* mysql: CALL test2();