Ответ 1
CREATE PROCEDURE SP_Reporting(IN tablename VARCHAR(20))
proc_label:BEGIN
IF tablename IS NULL THEN
LEAVE proc_label;
END IF;
#proceed the code
END;
У меня очень простой вопрос, но я не получил никакого простого кода для выхода из SP с помощью Mysql. Может ли кто-нибудь поделиться со мной, как это сделать?
CREATE PROCEDURE SP_Reporting(IN tablename VARCHAR(20))
BEGIN
IF tablename IS NULL THEN
#Exit this stored procedure here
END IF;
#proceed the code
END;
CREATE PROCEDURE SP_Reporting(IN tablename VARCHAR(20))
proc_label:BEGIN
IF tablename IS NULL THEN
LEAVE proc_label;
END IF;
#proceed the code
END;
Не существует способа: гениев в MySQL не думали, что это было необходимо - они предпочитают массово долго, если блоки к элегантному шаблону кодирования "выйти с раннего".
Однако, чтобы справиться с этой ситуацией (в прошлом я использовал хороший эффект), нужно разбить процедуру на логические части, например:
CREATE PROCEDURE SP_Reporting(IN tablename VARCHAR(20))
BEGIN
IF tablename IS NOT NULL THEN
CALL SP_Reporting_2(tablename);
END IF;
END;
CREATE PROCEDURE SP_Reporting_2(IN tablename VARCHAR(20))
BEGIN
#proceed with code
END;
Почему бы не это:
CREATE PROCEDURE SP_Reporting(IN tablename VARCHAR(20))
BEGIN
IF tablename IS NOT NULL THEN
#proceed the code
END IF;
# Do nothing otherwise
END;
Если вы хотите "ранний выход" для ситуации, в которой не было ошибки, используйте принятый ответ, отправленный @piotrm. Наиболее типично, однако, вы столкнетесь с ошибкой из-за ошибки (особенно в процедуре SQL).
По версии MySQL v5.5 вы можете создать исключение. Отрицание обработчиков исключений и т.д., Которые достигнут того же результата, но более чистым, более острым образом.
Вот как:
DECLARE CUSTOM_EXCEPTION CONDITION FOR SQLSTATE '45000';
IF <Some Error Condition> THEN
SIGNAL CUSTOM_EXCEPTION
SET MESSAGE_TEXT = 'Your Custom Error Message';
END IF;
Примечание SQLSTATE '45000'
означает "Необработанное пользовательское условие исключения". По умолчанию это приведет к появлению кода ошибки 1644
(который имеет то же значение). Обратите внимание, что вы можете выбросить другие коды условий или коды ошибок, если хотите (плюс дополнительные сведения об обработке исключений).
Подробнее об этом, проверьте:
https://dev.mysql.com/doc/refman/5.5/en/signal.html
MainLabel:BEGIN
IF (<condition>) IS NOT NULL THEN
LEAVE MainLabel;
END IF;
....code
i.e.
IF (@skipMe) IS NOT NULL THEN /* @skipMe returns Null if never set or set to NULL */
LEAVE MainLabel;
END IF;