Mysql - Как выйти / выйти из хранимой процедуры - PullRequest
115 голосов
/ 07 июня 2011

У меня очень простой вопрос, но я не получил простой код для выхода из 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;

Ответы [ 6 ]

180 голосов
/ 07 июня 2011
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;
12 голосов
/ 07 июня 2011

Чтобы справиться с этой ситуацией переносимым способом (т. Е. Работать со всеми базами данных, потому что она не использует метку 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;
8 голосов
/ 22 сентября 2017

Если вы хотите «досрочного выхода» для ситуации, в которой не было ошибок, используйте принятый ответ, опубликованный @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

Как вызвать ошибку в функции MySQL

http://www.databasejournal.com/features/mysql/mysql-error-handling-using-the-signal-and-resignal-statements.html

Приложение

Перечитывая этот пост, я понял, что мне нужно добавить кое-что еще.До MySQL v5.5 существовал способ эмулировать создание исключения.Это не совсем то же самое, но это был аналог: создайте ошибку, вызвав несуществующую процедуру.Назовите процедуру по имени, которое имеет смысл, чтобы получить полезные средства для определения, в чем заключалась проблема.При возникновении ошибки вы увидите строку сбоя (в зависимости от контекста выполнения).

Например:

CALL AttemptedToInsertSomethingInvalid;

Обратите внимание, что когдаВы создаете процедуру, для таких вещей нет проверки.Поэтому в то время, как в скомпилированном языке вы никогда не могли бы вызвать функцию, которой там не было, в таком скрипте он просто потерпит неудачу во время выполнения, что в данном случае является именно тем, что нужно!

2 голосов
/ 11 октября 2018

Это работает для меня:

 CREATE DEFINER=`root`@`%` PROCEDURE `save_package_as_template`( IN package_id int , 
IN bus_fun_temp_id int  , OUT o_message VARCHAR (50) ,
            OUT o_number INT )
 BEGIN

DECLARE  v_pkg_name  varchar(50) ;

DECLARE  v_pkg_temp_id  int(10)  ; 

DECLARE  v_workflow_count INT(10);

-- checking if workflow created for package
select count(*)  INTO v_workflow_count from workflow w where w.package_id = 
package_id ;

this_proc:BEGIN   -- this_proc block start here 

 IF  v_workflow_count = 0 THEN
   select 'no work flow ' as 'workflow_status' ;
    SET o_message ='Work flow is not created for this package.';
    SET  o_number = -2 ;
      LEAVE this_proc;
 END IF;

select 'work flow  created ' as 'workflow_status' ;
-- To  send some message
SET o_message ='SUCCESSFUL';
SET  o_number = 1 ;

  END ;-- this_proc block end here 

END
2 голосов
/ 07 июня 2011

Почему бы не это:

CREATE PROCEDURE SP_Reporting(IN tablename VARCHAR(20))
BEGIN
     IF tablename IS NOT NULL THEN
          #proceed the code
     END IF;
     # Do nothing otherwise
END;
0 голосов
/ 25 августа 2016
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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...