sql拋出異常
㈠ 如何Mysql觸發器中拋出一個異常
從Mysql 5.5 開始為我們提供了SIGNAL函數來實現這個功能。
[sql] view plain
CREATE TRIGGER `tg_order_create` AFTER INSERT ON `tp_order` FOR EACH ROW BEGIN
DECLARE msg varchar(200);
/*凍結金額*/
IF 2=NEW.condition THEN
UPDATE `tp_user` SET `frozen_amount`=`frozen_amount`+NEW.amount WHERE `id`=NEW.uid AND `amount`-`frozen_amount` > NEW.amount;
/*如果余額不足,產生一個錯誤*/
IF ROW_COUNT() <> 1 THEN
set msg = "用戶余額不足以完成支付.";
SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = msg;
END IF;
/*扣除金額*/
ELSEIF 3=NEW.condition THEN
UPDATE `tp_user` SET `amount`=`amount`-NEW.amount WHERE `id`=NEW.uid AND `amount`-`frozen_amount` > NEW.amount;
/*如果余額不足,產生一個錯誤*/
IF ROW_COUNT() <> 1 THEN
set msg = "用戶余額不足以完成支付.";
SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = msg;
END IF;
END IF;
END;
這里這條觸發器的功能是庫存操作,當庫存足夠的時候 減少庫存,否則 拋出一個異常並報告商品庫存不足:
[sql] view plain
CREATE TRIGGER `TG_order_detail_dec_stock` BEFORE INSERT ON `tp_order_detail` FOR EACH ROW BEGIN
DECLARE msg VARCHAR(200);
UPDATE `tp_stock` SET `num`=`num`-NEW.num WHERE `goods_id`=NEW.goods_id AND `mid`=NEW.mid AND `num`>=NEW.num;
IF ROW_COUNT() <> 1 THEN
SELECT CONCAT(`name`, ' 庫存不足.') INTO msg FROM `tp_goods` WHERE `id`=NEW.goods_id;
SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = msg;
END IF;
END;
在php端的處理(注:使用ThinkPHP框架):
[php] view plain
//前面省略若干行....
try {
if (false === ($order_pk = $tbl_order->add($order))) {
$tbl->rollback();
echo json_encode(array('success' => -1, 'message' => "創建訂單失敗!."), JSON_UNESCAPED_UNICODE);
return;
}
}catch (\PDOException $e){
$errInfo=$e->errorInfo[2];
$tbl->rollback();
echo json_encode(array('success' => -1, 'message' => "創建訂單失敗!,{$errInfo}"), JSON_UNESCAPED_UNICODE);
return;
}
//後面省略若干行....
㈡ sql server的error_message是幹嘛用的
RAISERROR
返回用戶定義的錯誤信息並設系統標志,記錄發生錯誤。通過使用 RAISERROR 語句,客戶端可以從 sysmessages 表中檢索條目,或者使用用戶指定的嚴重度和狀態信息動態地生成一條消息。這條消息在定義後就作為伺服器錯誤信息返回給客戶端。
語法
RAISERROR ( { msg_id | msg_str } { , severity , state }
[ , argument [ ,...n ] ] )
[ WITH option [ ,...n ] ]
參數
msg_id
存儲於 sysmessages 表中的用戶定義的錯誤信息。用戶定義錯誤信息的錯誤號應大於 50,000。由特殊消息產生的錯誤是第 50,000 號。
msg_str
是一條特殊消息,其格式與 C 語言中使用的 PRINTF 格式樣式相似。此錯誤信息最多可包含 400 個字元。如果該信息包含的字元超過 400 個,則只能顯示前 397 個並將添加一個省略號以表示該信息已被截斷。所有特定消息的標准消息 ID 是 14,000。
msg_str 支持下面的格式:
% [[flag] [width] [precision] [{h | l}]] type
可在 msg_str 中使用的參數包括:
flag
用於確定用戶定義的錯誤信息的間距和對齊的代碼。
可以查閱一下SQL SERVER的聯機叢書(在安裝了MSSQL的開始菜單里可以查到)
㈢ 我用Java連接資料庫,try Catch ,try執行sql語句都成功了,但是catch還是拋出異常,這是怎麼回事
catch裡面system.out.println(e); 這樣可以列印出異常,列印出異常就一目瞭然了
㈣ 在sql裡面raiserror有什麼作用的啊
RAISERROR是拋出SQL語句異常或錯誤的關鍵字,在存儲過程里經常用到。
用法:
使用RAISERROR後需帶三個參數,分別如下:
RAISERROR(參數一,參數二,參數三)
參數一:提示出錯信息
參數二:錯誤的狀態
參數三:錯誤的級別
例如:RAISERROR('過程執行出錯,行【100】',16,1),16為狀態,級別1,錯誤信息為:過程執行出錯,行【100】。
㈤ php sql 異常判斷
可以使用 mysql_errno() 來判斷上一條sql語句是否執行成功. 返回非0 都表示錯誤.
(若想獲取錯誤的文本描述信息 , 可以使用 mysql_error() )
例子:
$資源句柄 = mysql_connect(....);
@mysql_query('abcdee' , $資源句柄);
var_mp(mysql_errno($資源句柄));
var_mp(mysql_error($資源句柄));
================================
實現判斷語句是否正確. 那就得在拼接sql的時候下功夫.
如果把欄位值的驗證與過濾做到位了.
那拼接出來的sql 不會有問題的.