mysql存儲過程拋異常
加一個事務
多加幾個判斷就可以處理存儲過程中的異常了,請採納!
❷ mysql 創建存儲過程時錯誤
如果t_kecheng只有2個欄位的話,並且數據類型和存儲過程輸入參數一致的話,存儲過程沒問題。
mysql的1064錯誤就是語法不正確,最好給出t_kecheng的表結構,還有,你這個錯誤是在創建的時候報的還是怎麼?
自己簡單創建了個表,是沒問題的,另外你注意一下:參數名最好不要跟欄位名起一樣的,有時會出現很多不必要的麻煩,比如如果你t_kecheng表裡的欄位名也叫pno和pname,那麼你參數最好用v_pno或v_pname,這樣區分一下。
createtablet_kecheng
(pnoint,
pnamevarchar(20))
CREATEPROCEDUREpro
(INpnoINT,
INpnameVARCHAR(20))
BEGIN
INSERTINTOt_kechengVALUES(pno,pname);
END;
隨便輸入點信息也是可以的。

❸ 如何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;
}
//後面省略若干行....
❹ mybatis在mysql調用存儲過程時為什麼會出現以下錯誤
首先定義一個MySQL存儲過程:
DROP PROCEDURE IF EXISTS test ;
CREATE PROCEDURE test (IN p1 VARCHAR(26), OUT pResult VARCHAR(512))
BEGIN
SET pResult := NULL;
SET pResult :=CONCAT ( 'test',p1);
SELECT * FROM tb2 WHERE commet lik Concat('%',p1, '%'); -- this 返回一個結果集
END;
tb2的表結構和數據如下:
DROP TABLE IF EXISTS `tb2`;
CREATE TABLE `tb2` (
`t_id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
`Name` varchar(255) DEFAULT NULL COMMENT '欄位名',
`type` int(1) DEFAULT NULL COMMENT '類型,0-正常,1-異常,2-傳輸,3-退單',
`commet` varchar(255) DEFAULT NULL COMMENT '備注',
❺ mysql 存儲過程 異常 是否自動 回滾
是滴,默認是隱式的開始與提交,出現異常會默認自動回滾到開始位置,任何一個使用JDBC操作資料庫的SQL命令,在默認情況下,隱式開始與提交事務。當顯示的調用事物時,就必須顯示使用commit當使用rollback後也要進行commit;
❻ MySQL-python連接MySQL資料庫問題,總是拋異常。
不要剛開始學多線程編程就這樣玩。connection 和 cursor 都不是線程安全的。
如果測試環境用多個線程,每個線程要在線程裡面獲取自己的 connection,然後從這個connection 獲取 cursor.
如果生產環境用多個線程,建議使用線程安全的連接池。
❼ MYSQL 存儲過程 中怎麼捕獲異常
DECLARE處理程序的使用:
DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement
其中,
handler_type的取值范圍:CONTINUE | EXIT | UNDO
condition_value的取值范圍:SQLSTATE [VALUE] sqlstate_value | condition_name | SQLWARNING | NOT FOUND | SQLEXCEPTION | mysql_error_code
這個語句指定每個可以處理一個或多個條件的處理程序。如果產生一個或多個條件,指定的語句被執行。對一個CONTINUE處理程序,當前子程序的執行在執行處理程序語句之後繼續。對於EXIT處理程序,當前BEGIN...END復合語句的執行被終止。UNDO 處理程序類型語句還不被支持。
· SQLWARNING是對所有以01開頭的SQLSTATE代碼的速記。
· NOT FOUND是對所有以02開頭的SQLSTATE代碼的速記。
· SQLEXCEPTION是對所有沒有被SQLWARNING或NOT FOUND捕獲的SQLSTATE代碼的速記。
註:除了SQLSTATE值,MySQL錯誤代碼也不被支持。
例:
[sql]viewplainprint?
delimiter$$
CREATETABLE`_t1`(
`id`int(11)NOTNULLAUTO_INCREMENT,
`val1`varchar(20)DEFAULTNULL,
`val2`int(11)DEFAULTNULL,
PRIMARYKEY(`id`)
)ENGINE=InnoDBAUTO_INCREMENT=113DEFAULTCHARSET=latin1$$
[sql]viewplainprint?
DELIMITER$$
CREATEDEFINER=`abandonship`@`%`PROCEDURE`P_TestException`()
BEGIN
declare_var,_errintdefault0;
,sqlwarning,notfoundset_err=1;
insertinto_t1(val1,val2)value(2012,'abandonship');
if_err=1then
set_var=2;
endif;
selectcasewhen_var=2then'出錯了'else_varend;
調用該存儲過程將返回:出錯了
❽ MYSQL 存儲過程報錯Deadlock found when trying to get lock; try restarting transaction
這個死鎖估計是有數據沒了, 或者某個操作被回滾了
要避免這個問題方法有很多
事務盡量不要太復雜
在使用表或者行的時候, 盡量設定一個順序, 比如同一時間段線程A 競爭 1 2 資源, 線程 B 競爭 2 1 資源出現死鎖, 如果改成 A 使用 1 2 B 也是使用的 1 2 , 這樣再差也只會出現線程A/B去等待線程B/A執行完畢再去訪問資源
將一些容易出現死鎖的欄位改成索引, 這樣在競爭資源的時候mysql將不再上鎖[doge]
如果你是mysql資料庫, 則盡量避免使用 insert ... select 這樣的sql(oracle不用), 因為他會為你需要查詢的條件也上鎖, 這樣也會容易出現死鎖的問題
捕獲異常, 然後在出現這個異常的時候再次執行一次死鎖的sql語句
待續, 我也沒遇到更多的出現死鎖的情況了, 等遇到再說
以上幾點如果有錯的話, 請指出, 我們相互探討, 畢竟這也是我從筆記裡面找出來的, 可能有錯誤
