代码之家  ›  专栏  ›  技术社区  ›  Luis Cardoza Bird

Mysql管理错误消息

  •  1
  • Luis Cardoza Bird  · 技术社区  · 7 年前

    我会直截了当地说。

    桌子

    Create Table Beneficios(
    IdBeneficio int unsigned primary key auto_increment not null,
    Nombre varchar(150)not null,
    Estado boolean default true not null,
    Descripcion varchar(300)not null,
    Tipo enum('Promocio','Descuento','Oferta')
    );
    

    create procedure registrarBeneficio(idSucursalLey int unsigned, nombreBeneficio varchar(150), estadoBeneficio boolean, descripcionBeneficio varchar(300), tipoBeneficio enum('Promocion', 'Descuento', 'Oferta'))
    begin
    DECLARE EXIT HANDLER FOR 1265
    begin
        SELECT "Beneficio no encontrado" as 'ERROR_NO SQLSTATE';
    end;
    declare exit handler for sqlexception
    begin
        rollback;
        resignal;
    end;
    
    start transaction;
    if (tipoBeneficio not in('Promocion','Descuento','Oferta')) then
        signal sqlstate '45000' set message_text = 'Beneficio no encontrado', mysql_errno = 1265;
        rollback;
    end if;
    if exists(select nombre from Beneficios where IdSucursal = idSucursalLey) then
        insert into Beneficios(IdSucursal, Nombre, Estado, Descripcion, Tipo) values (idSucursalLey, nombreBeneficio, estadoBeneficio, descripcionBeneficio, tipoBeneficio);
        commit;
    else
        signal sqlstate '45000' set message_text = 'Sucursal no encontrada', mysql_errno = 2000;
        rollback;
    end if;
    end$$
    

    当我调用存储过程时,我得到以下消息

    错误代码:1265。第1行“tipogenetio”列的数据被截断

    有益的,不可鼓励的

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

    http://www.chriscalender.com/tag/declare-exit-handler-for-sqlexception/

    MySQL Stored Procedure Error Handling

    请告诉我我做错了什么:(

    1 回复  |  直到 7 年前
        1
  •  1
  •   Solarflare    7 年前

    如果用无效的 enum 最后一个参数的值 tipoBeneficio enum('Promocion', 'Descuento', 'Oferta') ,该错误发生在过程开始之前,因此在您定义任何处理程序之前。

    你可以使用例如。 varchar(30) 对于您的变量。然后,如果变量的值无效,您在过程中的检查将起作用,并可以引发自定义错误消息。

    除非这是一个简化的过程,否则此处不需要事务(因为只有一条语句更改数据,即 insert

    还要注意 signal 中断代码执行,因此无法到达 rollback if -方块。因为你有一个 回降 在处理程序中,除了检查之外,它对大多数错误都没有影响 tipoBeneficio 1265 没有回滚。