web-dev-qa-db-fra.com

Mysql - Comment quitter / quitter une procédure stockée

J'ai une question très simple mais je n'ai pas eu de code simple pour sortir de SP en utilisant Mysql. Quelqu'un peut-il partager avec moi comment faire cela?

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;
116
Joe Ijam
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;
184
piotrm

Pour gérer cette situation de manière portable (c'est-à-dire qu'elle fonctionnera sur toutes les bases de données car elle n'utilise pas le libellé MySQL Kung fu), divisez la procédure en parties logiques, comme suit:

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;
12
Bohemian

Si vous souhaitez une "sortie anticipée" pour une situation dans laquelle il n'y a pas eu d'erreur, utilisez la réponse acceptée publiée par @piotrm. Le plus souvent, toutefois, vous perdrez votre temps à cause d’une condition d’erreur (en particulier dans une procédure SQL).

Depuis MySQL v5.5, vous pouvez générer une exception. Négocier les gestionnaires d'exceptions, etc. qui aboutiront au même résultat, mais d'une manière plus propre et plus poignante.

Voici comment:

DECLARE CUSTOM_EXCEPTION CONDITION FOR SQLSTATE '45000';

IF <Some Error Condition> THEN      
    SIGNAL CUSTOM_EXCEPTION
    SET MESSAGE_TEXT = 'Your Custom Error Message';
END IF;     

Remarque SQLSTATE '45000' équivaut à "Condition d'exception non gérée par l'utilisateur". Par défaut, cela produira un code d'erreur de 1644 (qui a la même signification). Notez que vous pouvez générer d'autres codes de condition ou codes d'erreur si nécessaire (ainsi que des détails supplémentaires pour la gestion des exceptions).

Pour plus sur ce sujet, consultez:

https://dev.mysql.com/doc/refman/5.5/en/signal.html

Comment générer une erreur dans une fonction MySQL

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

Addendum

En relisant ce billet, j'ai réalisé que j'avais quelque chose de plus à ajouter. Avant MySQL v5.5, il existait un moyen d'émuler une exception. Ce n'est pas exactement la même chose, mais c'était l'analogue: créer une erreur en appelant une procédure qui n'existe pas. Appelez la procédure par un nom qui a du sens afin d’obtenir un moyen utile de déterminer le problème. Lorsque l'erreur se produit, vous verrez la ligne d'échec (selon votre contexte d'exécution).

Par exemple:

CALL AttemptedToInsertSomethingInvalid;

Notez que lorsque vous créez une procédure, aucune validation n'est effectuée sur de telles choses. Ainsi, dans quelque chose qui ressemble à un langage compilé, vous ne pouvez jamais appeler une fonction qui n'y était pas, mais dans un script comme celui-ci, cela échouera simplement au moment de l'exécution, ce qui est exactement ce qui est souhaité dans ce cas!

8
BuvinJ

Cela fonctionne pour moi:

 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
Devendra Singraul

Pourquoi pas ça:

CREATE PROCEDURE SP_Reporting(IN tablename VARCHAR(20))
BEGIN
     IF tablename IS NOT NULL THEN
          #proceed the code
     END IF;
     # Do nothing otherwise
END;
2
Stephen
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;
0
sdfor