Обработка Ошибок Хранимой Процедуры MySQL

Я считаю, что в настоящее время в MySQL нет ничего, что позволяет получить доступ к SQLSTATE последнего выполненного оператора в хранимой процедуре MySQL. Это означает, что при родовом SQLException возникает в рамках хранимой процедуры трудно / невозможно получить точный характер ошибки.

у кого-нибудь есть обходной путь для получения SQLSTATE ошибки в хранимой процедуре MySQL, которая не включает объявление обработчика для всех возможных Кодом sqlstate?

например - представьте, что я пытаюсь вернуть error_status, который выходит за рамки общего " SQLException произошло где-то в этом BEGIN....END блок" в следующем:

DELIMITER $$

CREATE PROCEDURE `myProcedure`(OUT o_error_status varchar(50))
MY_BLOCK: BEGIN

 DECLARE EXIT handler for 1062 set o_error_status := "Duplicate entry in table";
 DECLARE EXIT handler for 1048 set o_error_status := "Trying to populate a non-null column with null value"; 
-- declare handlers ad nauseum here....

 DECLARE EXIT handler for sqlexception set o_error_status:= "Generic SQLException. You'll just have to figure out the SQLSTATE yourself...." ;

-- Procedure logic that might error to follow here...

END MY_BLOCK$$

какие-либо советы?

PS я запускаю MySQL 5.1.49

3 ответов


get DIAGNOSTICS доступен в 5.6.4

посмотреть http://dev.mysql.com/doc/refman/5.6/en/get-diagnostics.html


Я считаю, что в настоящее время в MySQL нет ничего, что позволяет получить доступ к SQLSTATE последнего выполненного оператора в хранимой процедуре MySQL. Это значит вот что ... трудно / невозможно получить точную природу ошибки.

к счастью, это не так.

SHOW ERRORS LIMIT 1   -- for SQL-state > 2
SHOW WARNINGS LIMIT 1 -- for SQL-state 1,2

покажет последнюю ошибку или предупреждение.

чтобы предотвратить перечисление каждой ошибки, вы можете обрабатывать класс SQL-ошибок, таких как Итак:

sqlwarning является сокращением для класса значений SQLSTATE, которые начинаются с '01'.

not FOUND является сокращением для класса значений SQLSTATE, которые начинаются с '02'. Это актуально только в контексте курсоров и используется для управления тем, что происходит, когда курсор достигает конца набора данных. Если нет больше строк, возникает состоянии данных значение sqlstate 02000. Чтобы обнаружить это условие, можно настроить обработчик для него (или для Не найдено состояние). Пример приведен в разделе 12.7.5, "курсоры". Это условие также возникает для SELECT ... В операторы var_list, которые не получают строк.

SQLEXCEPTION является сокращением для класса значений SQLSTATE, которые не начинаются с "00", " 01 " или "02".

поэтому для обработки исключения вам нужно только do:

DECLARE EXIT HANDLER FOR SQLSTATE SQLEXCEPTION .....;

Links:
http://dev.mysql.com/doc/refman/5.5/en/signal.html
http://dev.mysql.com/doc/refman/5.0/en/declare-handler.html


Я делаю следующее обходное решение: используя SELECT, чтобы вызвать ошибку. Например:

SELECT RAISE_ERROR_unable_to_update_basket;

это приведет к следующему сообщению об ошибке (пример):

ERROR 1054 (42S22): Unknown column 'RAISE_ERROR_unable_to_update_basket' in 'field list'

Я обертываю вызов хранимой процедуры в try { ... } catch { ... } и теперь может справиться с этой ошибкой. Это, конечно, будет работать только для провоцирования пользовательских сообщений об ошибках из вашей хранимой процедуры и не будет обрабатывать любые ошибки SQL или базы данных, которые могут возникнуть (из-за дубликат-ввод ключа). В последнем случае вы можете обойти это, используя решение Johan.