當前位置:首頁 » 編程語言 » sql拋出異常

sql拋出異常

發布時間: 2023-02-27 19:56:21

㈠ 如何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 不會有問題的.

熱點內容
c語言擲骰子 發布:2024-05-17 02:11:05 瀏覽:488
eclipsepython調試工具 發布:2024-05-17 02:10:49 瀏覽:819
oracle創建表sql語句 發布:2024-05-17 02:06:38 瀏覽:251
手機建立文件夾 發布:2024-05-17 01:56:19 瀏覽:655
方舟伺服器怎麼綁定賬號 發布:2024-05-17 01:52:32 瀏覽:734
運行javajar 發布:2024-05-17 01:29:14 瀏覽:14
怎麼找回訪問密碼 發布:2024-05-17 01:22:45 瀏覽:747
吉林蘋果伺服器網路時間地址 發布:2024-05-17 01:21:29 瀏覽:213
dns緩存ros 發布:2024-05-17 01:20:45 瀏覽:914
壓縮機油洗 發布:2024-05-17 00:59:44 瀏覽:171