mysql 異常處理

2021-07-31 11:09:42 字數 1966 閱讀 8095

針對儲存過程 、觸發器或函式內部語句可能發生的錯誤或警告資訊,需要進行相關異常或稱 例外的捕捉,然後作出相應的處理,異常處理的方式如下:

declare handler for handler_actions

mysql>create table test.t (s1 int,primary key (s1));
query ok, 0 rows affected (0.00 sec)
mysql>delimiter //
mysql>create procedure handlerdemo ()
->begin
->declare continue handler for sqlstate '23000' set @x2 = 1;
->set @x = 1;
->insert into test.t values (1);
->set @x = 2;
->insert into test.t values (1);
->set @x = 3;
->end;
->//
query ok, 0 rows affected (0.00 sec)
mysql>call handlerdemo()//
query ok, 0 rows affected (0.00 sec)
mysql>select @x//
+------+
| @x   |
+------+
| 3    |
+------+
1 row in set (0.00 sec)
注意到,@x是3,這表明mysql被執行到程式的末尾。如果是declare exit handler for sqlstate '23000' set @x2 = 1,@x是2。如果沒有declare exit/continue handler for sqlstate '23000' set @x2 = 1,將會彈出[err] 1062 - duplicate entry '1' for key 'primary'

mysql> create table tx(

a int,

b int,

unique key idx_a(a)

)engine =innodb

mysql>create procedure sp_tx_ios_proc()

begin

declare errno tinyint default '0';

#如sql異常,將errno設定為1且後續執行退出

declare continue handler for sqlexception 

begin 

rollback;

set errno = 1; 

end;

#開啟事務

start transaction;

insert into tx(a,b)values(1,1),(2,2),(3,3); #執行

insert into tx(a,b)values(1,2); #因約束,全部回滾

#errno為1,事務回滾sql

select errno;

endtx表中一行記錄都沒有

mysql 多異常 處理 MySQL異常處理彙總

mysql錯誤處理彙總 mysql無法啟動 mysql啟動時提示timeout error occurred trying to start mysql daemon 解決辦法 執行 usr bin mysql install db,修復下就ok了.mysql資料表無法使用 啟動後發現所有的資料表都...

mysql異常捕獲 mysql異常處理

error 1130 hy000 host 172.17.0.1 is not allowed to connect to this mysql server use mysql update user set host where user root flush privileges 解決辦法 進...

mysql 多異常 處理 MYSQL效能異常處理

通過information schema.processlist表中的連線資訊生成需要處理掉的mysql連線的語句臨時檔案,然後執行臨時檔案中生成的指令 mysql select concat kill id,from information schema.processlist where use...