儲存過程能完成各種複雜的任務,減輕dao層的編寫任務,也使得dao層更好維護,它非常重要!!!
儲存過程涉及一系列的操作,所以我們需要使用事務保證資料完整性。
delimiter $$
use `exercise_sql`$$
drop
procedure
ifexists
`testtrancation`$$
create definer=`root`@`localhost`
procedure
`testtrancation`(in id_for_del int,in id_with_constraint int)
begin
declare exit handler
for sqlexception,
sqlwarning rollback ;
start
transaction ;
delete
from
customer
where cust_id = id_for_del;
# 對應的引用表裡面沒有對應的記錄,可以刪除
delete
from
customer
where cust_id = id_with_constraint ;
# cust_id 同樣被引用為外來鍵, cust_id =1 對應有記錄,不能刪除
commit ;
end$$
delimiter ;
測試用例:
有如下客戶表客戶id(1-4)有訂單,有外來鍵約束,
id >= 5 沒有對應訂單,沒有外來鍵約束
同時刪除 1,6 號客戶,操作回滾
call testtrancation(1,6);
cust_id cust_name
------- -----------
1 shan
2 dan
3 baobao
4 pangzi
5 danmei
6 liudan
同時刪除 0,6 號客戶,操作成功,並提交
call testtrancation(0,6);
cust_id cust_name
------- -----------
1 shan
2 dan
3 baobao
4 pangzi
5 danmei
注意:delete
from
customer
where cust_id =0
雖然 cust_id = 0 的客戶資訊不存在但是刪除是不會報錯或者產生異常的,只是影響行數為0
1 queries executed, 1 success, 0 errors, 0 warnings
查詢:delete
from customer where cust_id =0
共 0 行受到影響
執行耗時 : 0 sec
傳送時間 : 0 sec
總耗時 : 0.001 sec
declare exit handler
for sqlexception, sqlwarning rollback;
總體定義了出現異常和警告的情況下進行回滾操作這一處理方式來完成事務控制,還可以根據具體需要定義其他更加具體的預定義處理。
可以通過其他具體的判斷做出回滾。
mysql如何在儲存過程中搜尋表名
源系統開發了很多的儲存過程,現在想在所有儲存過程中搜尋某張表名,怎麼實現?centos7.5 mysql5.6.46 1 將所有過程儲存匯出成檔案,在檔案裡進行搜尋 2 通過show create procedure方式將輸出內容輸出到乙個檔案 3 直接查詢information schema資料庫...
mysql儲存過程中使用事件
create definer root localhost procedure createbusiness parameter1 int begin routine body goes here.declare flag int default parameter1 宣告變數flag,將引數值賦給...
mysql儲存過程中使用事務
mysql儲存過程中使用事務 1 drop procedure ifexists test sp1 2create procedure test sp1 3begin 4declare t error integer default 0 5declare continue handler for s...