Mysql管理错误消息

时间:2017-07-27 18:10:53

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

我会直截了当地说。

这是我的表格

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

另请注意,signal会中断代码执行,因此您无法访问rollback - 块中的if。由于您的处理程序中也有rollback,因此除tipoBeneficio的检查外,对大多数错误都没有影响,因为1265的处理程序没有回滚。