Errores en procedimientos

Manejo de errores en procedimientos de MySQL

Programación de Bases de Datos (6.5.-Manipulación de errores o excepciones en MySQL)

Mostrar error al insertar un departamento en la base de datos de proyectos:

DELIMITER |
CREATE PROCEDURE Manejo()

BEGIN

    /*Declaramos el manipulador de errores*/

    DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' 
        SELECT 'Clave repetida.';

    /*Insertamos un nuevo departamento con clave repetida*/
    INSERT INTO departamento VALUES ('01','Comercial','Jaén');


    /*Mostramos todos los departamentos de la BD*/
    SELECT * FROM departamento; 

END
|
DELIMITER ;

Ejecución

CALL Manejo();

No funciona en phpMyAdmin, pero sí en consola!

Otra forma:

DELIMITER |
CREATE PROCEDURE Manejador_error1()

BEGIN

    DECLARE mensaje VARCHAR(30) DEFAULT "Departamento introducido OK";

    /*Declaramos el manipulador de errores*/
    DECLARE CONTINUE HANDLER FOR SQLSTATE '23000'
        SET mensaje = 'Clave repetida';

    /*Insertamos un nuevo departamento con clave repetida*/
    INSERT INTO departamento VALUES ('01','Comercial','Jaén');

    /*Mostramos el mensaje*/
    SELECT mensaje;

END
|

DELIMITER ;

Ejecución

CALL Manejador_error1();
DELIMITER |
CREATE PROCEDURE Manejador_error2()

BEGIN
    DECLARE mensaje VARCHAR(30) DEFAULT "Departamento introducido OK";

    /*Declaramos el manipulador de errores*/
    DECLARE EXIT HANDLER FOR SQLSTATE '23000'
        SELECT 'Clave repetida';

    /*Insertamos un nuevo departamento con clave repetida*/
    INSERT INTO departamento VALUES ('01','Comercial','Jaén');

    /*Mostramos el mensaje*/
    SELECT mensaje;

END
|
DELIMITER ;

Ejecución

CALL Manejador_error2();

Manejo de errores

Manejo de excepciones en MariaDB/MySQL

GET DIAGNOSTICS Statement

DELIMITER $$
CREATE OR REPLACE PROCEDURE insertarPersona(_id INT, nombre VARCHAR(20))
BEGIN
    DECLARE codigo CHAR(5) DEFAULT NULL;
    DECLARE mensaje VARCHAR(50) DEFAULT 'dato introducido OK';

    -- DECLARE CONTINUE HANDLER FOR SQLSTATE '23000'
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
        GET DIAGNOSTICS CONDITION 1 codigo = RETURNED_SQLSTATE, mensaje = MESSAGE_TEXT;

    INSERT INTO persona VALUES (_id, nombre);
    IF codigo iS NOT NULL THEN
        INSERT INTO errores VALUES (codigo, mensaje, CURRENT_USER, NOW());
        SELECT mensaje AS Error;
    ELSE
        SELECT mensaje AS Info;
    END IF;
END
$$

DELIMITER ;

Handling Errors

Ejemplo: insertar un empleado en la base de datos proyectosDB

DELIMITER $$
CREATE PROCEDURE do_insert(value VARCHAR(3), name VARCHAR(30))
BEGIN
  -- Declare variables to hold diagnostics area information
  DECLARE code CHAR(5) DEFAULT '00000';
  DECLARE msg TEXT;
  DECLARE nrows INT;
  DECLARE result TEXT;
  DECLARE errorNumber VARCHAR(10);

  -- Declare exception handler for failed insert
  DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
    BEGIN
      GET DIAGNOSTICS CONDITION 1
        code = RETURNED_SQLSTATE, msg = MESSAGE_TEXT, errorNumber = MYSQL_ERRNO;
      SET result = CONCAT('insert failed, error = ', code,', message = ', msg, ', number = ', errorNumber);
    END;

  -- Perform the insert in proyectosDB database
  INSERT INTO empleado (cdemp, nombre) VALUES(value, name);

  -- Check whether the insert was successful
  IF code = '00000' THEN
    GET DIAGNOSTICS nrows = ROW_COUNT;
    SET result = CONCAT('insert succeeded, row count = ', nrows);   
  END IF;

  -- Say what happened
  SELECT result;
END$$
DELIMITER ;

Ejecución del procedimiento do_insert:

SET @p1 = 'B10', @p2 = 'Ana Martín';
CALL do_insert(@p1, @p2);

CALL do_insert(@p1, @p2);

Más información:

MySQL 8.0 Error Message Reference

GET DIAGNOSTICS Statement

Deja una respuesta