當前位置:首頁 » 存儲配置 » mysql存儲過程拋異常

mysql存儲過程拋異常

發布時間: 2022-12-25 01:52:34

❶ 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

這個死鎖估計是有數據沒了, 或者某個操作被回滾了

要避免這個問題方法有很多

  1. 事務盡量不要太復雜

  2. 在使用表或者行的時候, 盡量設定一個順序, 比如同一時間段線程A 競爭 1 2 資源, 線程 B 競爭 2 1 資源出現死鎖, 如果改成 A 使用 1 2 B 也是使用的 1 2 , 這樣再差也只會出現線程A/B去等待線程B/A執行完畢再去訪問資源

  3. 將一些容易出現死鎖的欄位改成索引, 這樣在競爭資源的時候mysql將不再上鎖[doge]

  4. 如果你是mysql資料庫, 則盡量避免使用 insert ... select 這樣的sql(oracle不用), 因為他會為你需要查詢的條件也上鎖, 這樣也會容易出現死鎖的問題

  5. 捕獲異常, 然後在出現這個異常的時候再次執行一次死鎖的sql語句

  6. 待續, 我也沒遇到更多的出現死鎖的情況了, 等遇到再說

以上幾點如果有錯的話, 請指出, 我們相互探討, 畢竟這也是我從筆記裡面找出來的, 可能有錯誤

熱點內容
java返回this 發布:2025-10-20 08:28:16 瀏覽:600
製作腳本網站 發布:2025-10-20 08:17:34 瀏覽:892
python中的init方法 發布:2025-10-20 08:17:33 瀏覽:585
圖案密碼什麼意思 發布:2025-10-20 08:16:56 瀏覽:769
怎麼清理微信視頻緩存 發布:2025-10-20 08:12:37 瀏覽:689
c語言編譯器怎麼看執行過程 發布:2025-10-20 08:00:32 瀏覽:1016
郵箱如何填寫發信伺服器 發布:2025-10-20 07:45:27 瀏覽:261
shell腳本入門案例 發布:2025-10-20 07:44:45 瀏覽:119
怎麼上傳照片瀏覽上傳 發布:2025-10-20 07:44:03 瀏覽:809
python股票數據獲取 發布:2025-10-20 07:39:44 瀏覽:718