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;
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;
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;
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
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!
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
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;
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;