Mysql 管理错误消息
Mysql manage error messages
开门见山
这是我的table
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' 列的数据被截断
然而,我实际上想做的是修改该错误消息以显示类似
无受益人
我检查这个链接没有成功解决我的疑问: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
请告诉我我做错了什么:(
如果您使用最后一个参数 tipoBeneficio enum('Promocion', 'Descuento', 'Oferta')
的无效 enum
值调用过程,则该错误发生在过程开始之前,因此发生在您定义任何处理程序之前。
您可以使用例如varchar(30)
用于您的变量。然后,您在过程中的检查将起作用,并且如果变量具有无效值,则可以引发您的自定义错误消息。
如果您使用太长的字符串调用您的过程,您将再次得到一个您无法在您的过程中捕捉到的(不同的)错误(但例如在您的应用程序中错误地调用了该过程)。
除非这是一个简化的过程,否则您在这里不需要事务(因为您只有一个更改数据的语句,insert
)。事实上,您应该小心处理过程内部的事务,因为它们不嵌套。如果您在您的过程之外开始一个事务,它也将在您执行该过程后提交或回滚。让调用者处理事务通常是个好主意。
另请注意,signal
会中断代码执行,因此您不会到达 if
块中的 rollback
。由于您的处理程序中也有一个 rollback
,因此它对大多数错误没有任何影响,除了检查 tipoBeneficio
,因为您的 1265
处理程序没有回滚。
开门见山
这是我的table
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' 列的数据被截断
然而,我实际上想做的是修改该错误消息以显示类似 无受益人
我检查这个链接没有成功解决我的疑问: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
请告诉我我做错了什么:(
如果您使用最后一个参数 tipoBeneficio enum('Promocion', 'Descuento', 'Oferta')
的无效 enum
值调用过程,则该错误发生在过程开始之前,因此发生在您定义任何处理程序之前。
您可以使用例如varchar(30)
用于您的变量。然后,您在过程中的检查将起作用,并且如果变量具有无效值,则可以引发您的自定义错误消息。
如果您使用太长的字符串调用您的过程,您将再次得到一个您无法在您的过程中捕捉到的(不同的)错误(但例如在您的应用程序中错误地调用了该过程)。
除非这是一个简化的过程,否则您在这里不需要事务(因为您只有一个更改数据的语句,insert
)。事实上,您应该小心处理过程内部的事务,因为它们不嵌套。如果您在您的过程之外开始一个事务,它也将在您执行该过程后提交或回滚。让调用者处理事务通常是个好主意。
另请注意,signal
会中断代码执行,因此您不会到达 if
块中的 rollback
。由于您的处理程序中也有一个 rollback
,因此它对大多数错误没有任何影响,除了检查 tipoBeneficio
,因为您的 1265
处理程序没有回滚。