2017-07-27 110 views
0

我會直接指向這一點。Mysql管理錯誤消息

這是我

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沒有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

如果用最後一個參數tipoBeneficio enum('Promocion', 'Descuento', 'Oferta')的值enum的值調用您的過程,那麼該錯誤發生在過程開始之前,因此在您定義任何處理程序之前。

您可以使用例如varchar(30)爲您的變量。然後,如果變量具有無效值,那麼您的程序中的檢查將起作用,並可能引發自定義錯誤消息。

如果你打電話給你的程序有一個字符串,它是太長,你將再次得到你不能在你的程序搭上了(不同的)錯誤(但例如在應用程序調用該程序錯誤)。

除非這是一個簡化程序,你不需要在這裏交易(因爲你只有一個改變數據的說法,insert)。事實上,你應該小心程序中的事務,因爲它們不會嵌套。如果你在你的程序之外啓動了一個事務,它也將在你執行程序之後被提交或回滾。讓調用者處理事務通常是一個好主意。

另請注意,signal會中斷代碼執行,因此您沒有在if區塊中訪問rollback。因爲您的處理程序中也有rollback,所以除了檢查tipoBeneficio之外,它對大多數錯誤沒有影響,因爲1265的處理程序沒有回滾。

+0

謝謝!我想可能是你答案的20%。我會改變那:) –