parameter - Mysql-Cómo salir/salir del procedimiento almacenado
leave mysql example (5)
Tengo una pregunta muy simple pero no obtuve ningún código simple para salir de SP usando Mysql. ¿Alguien puede compartir conmigo cómo hacer eso?
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;
¿Por qué no esto?
CREATE PROCEDURE SP_Reporting(IN tablename VARCHAR(20))
BEGIN
IF tablename IS NOT NULL THEN
#proceed the code
END IF;
# Do nothing otherwise
END;
No hay una manera: los genios de MySQL no pensaron que era necesario; prefieren bloques masivamente largos para el elegante patrón de codificación de "salir temprano".
Sin embargo, manejar esta situación (que he utilizado con buenos resultados en el pasado) es dividir el procedimiento en partes lógicas, como esta:
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 desea una "salida anticipada" para una situación en la que no hubo ningún error, utilice la respuesta aceptada publicada por @piotrm. Lo más habitual, sin embargo, es que se achique debido a una condición de error (especialmente en un procedimiento de SQL).
A partir de MySQL v5.5 puede lanzar una excepción. Negar a los manejadores de excepciones, etc., que lograrán el mismo resultado, pero de una manera más limpia y conmovedora.
Así es cómo:
DECLARE CUSTOM_EXCEPTION CONDITION FOR SQLSTATE ''45000'';
IF <Some Error Condition> THEN
SIGNAL CUSTOM_EXCEPTION
SET MESSAGE_TEXT = ''Your Custom Error Message'';
END IF;
Nota SQLSTATE ''45000''
equivale a "Condición de excepción definida por el usuario no controlada". Por defecto, esto producirá un código de error de 1644
(que tiene el mismo significado). Tenga en cuenta que puede arrojar otros códigos de condición o códigos de error si lo desea (además de detalles adicionales para el manejo de excepciones).
Para obtener más información sobre este tema, consulte:
https://dev.mysql.com/doc/refman/5.5/en/signal.html
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;
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;