【问题标题】:Mysql manage error messagesMysql管理错误信息
【发布时间】:2018-01-03 14:48:42
【问题描述】:

我会直奔主题。

这是我的桌子

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')
);

为了存储值,我决定调用一个 stored_procedure

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 行的“tipoBeneficio”列的数据被截断

但是,我实际上试图做的是修改该错误消息以显示类似 Beneficio No Encontrado

我检查此链接没有成功解决我的疑问: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

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

【问题讨论】:

    标签: mysql stored-procedures mysql-error-1064


    【解决方案1】:

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

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

    如果您使用过长的字符串调用您的程序,您将再次收到您无法在您的程序中捕获的(不同的)错误(但例如在您的应用程序中错误地调用了该程序)。

    除非这是一个简化的过程,否则这里不需要事务(因为您只有一个更改数据的语句,insert)。事实上,您应该小心过程中的事务,因为它们不会嵌套。如果您在过程之外启动事务,则在执行过程后它也将被提交或回滚。让调用者处理事务通常是个好主意。

    还要注意signal 会中断代码执行,因此您不会到达if 块中的rollback。由于您的处理程序中也有一个rollback,它对大多数错误没有任何后果,除了对tipoBeneficio 的检查,因为您的1265 处理程序没有回滚。

    【讨论】:

    • 谢谢!我在想也许是你答案的 20%。我要改变它:)
    猜你喜欢
    • 2012-06-29
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多