MySQL存儲(chǔ)過(guò)程例子(包含事務(wù),輸出參數(shù),嵌套調(diào)用)
更新時(shí)間:2010年09月13日 00:00:07 作者:
MySQL存儲(chǔ)過(guò)程例子,包含事務(wù),輸出參數(shù),嵌套調(diào)用,學(xué)習(xí)mysql存儲(chǔ)過(guò)程的朋友可以參考下。
drop procedure if exists pro_rep_shadow_rs;
delimiter |
----------------------------------
-- rep_shadow_rs
-- 用來(lái)處理信息的增加,更新和刪除
-- 每次只更新上次以來(lái)沒(méi)有做過(guò)的數(shù)據(jù)
-- 根據(jù)不同的標(biāo)志位
-- 需要一個(gè)輸出的參數(shù),
-- 如果返回為0,則調(diào)用失敗,事務(wù)回滾
-- 如果返回為1,調(diào)用成功,事務(wù)提交
--
-- 測(cè)試方法
-- call pro_rep_shadow_rs(@rtn);
-- select @rtn;
----------------------------------
create procedure pro_rep_shadow_rs(out rtn int)
begin
-- 聲明變量,所有的聲明必須在非聲明的語(yǔ)句前面
declare iLast_rep_sync_id int default -1;
declare iMax_rep_sync_id int default -1;
-- 如果出現(xiàn)異常,或自動(dòng)處理并rollback,但不再通知調(diào)用方了
-- 如果希望應(yīng)用獲得異常,需要將下面這一句,以及啟動(dòng)事務(wù)和提交事務(wù)的語(yǔ)句全部去掉
declare exit handler for sqlexception rollback;
-- 查找上一次的
select eid into iLast_rep_sync_id from rep_de_proc_log where tbl='rep_shadow_rs';
-- 如果不存在,則增加一行
if iLast_rep_sync_id=-1 then
insert into rep_de_proc_log(rid,eid,tbl) values(0,0,'rep_shadow_rs');
set iLast_rep_sync_id = 0;
end if;
-- 下一個(gè)數(shù)字
set iLast_rep_sync_id=iLast_rep_sync_id+1;
-- 設(shè)置默認(rèn)的返回值為0:失敗
set rtn=0;
-- 啟動(dòng)事務(wù)
start transaction;
-- 查找最大編號(hào)
select max(rep_sync_id) into iMax_rep_sync_id from rep_shadow_rs;
-- 有新數(shù)據(jù)
if iMax_rep_sync_id>=iLast_rep_sync_id then
-- 調(diào)用
call pro_rep_shadow_rs_do(iLast_rep_sync_id,iMax_rep_sync_id);
-- 更新日志
update rep_de_proc_log set rid=iLast_rep_sync_id,eid=iMax_rep_sync_id where tbl='rep_shadow_rs';
end if;
-- 運(yùn)行沒(méi)有異常,提交事務(wù)
commit;
-- 設(shè)置返回值為1
set rtn=1;
end;
delimiter ;
drop procedure if exists pro_rep_shadow_rs_do;
delimiter |
---------------------------------
-- 處理指定編號(hào)范圍內(nèi)的數(shù)據(jù)
-- 需要輸入2個(gè)參數(shù)
-- last_rep_sync_id 是編號(hào)的最小值
-- max_rep_sync_id 是編號(hào)的最大值
-- 無(wú)返回值
---------------------------------
create procedure pro_rep_shadow_rs_do(last_rep_sync_id int, max_rep_sync_id int)
begin
declare iRep_operationtype varchar(1);
declare iRep_status varchar(1);
declare iRep_Sync_id int;
declare iId int;
-- 這個(gè)用于處理游標(biāo)到達(dá)最后一行的情況
declare stop int default 0;
-- 聲明游標(biāo)
declare cur cursor for select id,Rep_operationtype,iRep_status,rep_sync_id from rep_shadow_rs where rep_sync_id between last_rep_sync_id and max_rep_sync_id;
-- 聲明游標(biāo)的異常處理,設(shè)置一個(gè)終止標(biāo)記
declare CONTINUE HANDLER FOR SQLSTATE '02000' SET stop=1;
-- 打開(kāi)游標(biāo)
open cur;
-- 讀取一行數(shù)據(jù)到變量
fetch cur into iId,iRep_operationtype,iRep_status,iRep_Sync_id;
-- 這個(gè)就是判斷是否游標(biāo)已經(jīng)到達(dá)了最后
while stop <> 1 do
-- 各種判斷
if iRep_operationtype='I' then
insert into rs0811 (id,fnbm) select id,fnbm from rep_shadow_rs where rep_sync_id=iRep_sync_id;
elseif iRep_operationtype='U' then
begin
if iRep_status='A' then
insert into rs0811 (id,fnbm) select id,fnbm from rep_shadow_rs where rep_sync_id=iRep_sync_id;
elseif iRep_status='B' then
delete from rs0811 where id=iId;
end if;
end;
elseif iRep_operationtype='D' then
delete from rs0811 where id=iId;
end if;
-- 讀取下一行的數(shù)據(jù)
fetch cur into iId,iRep_operationtype,iRep_status,iRep_Sync_id;
end while; -- 循環(huán)結(jié)束
close cur; -- 關(guān)閉游標(biāo)
end;
delimiter |
----------------------------------
-- rep_shadow_rs
-- 用來(lái)處理信息的增加,更新和刪除
-- 每次只更新上次以來(lái)沒(méi)有做過(guò)的數(shù)據(jù)
-- 根據(jù)不同的標(biāo)志位
-- 需要一個(gè)輸出的參數(shù),
-- 如果返回為0,則調(diào)用失敗,事務(wù)回滾
-- 如果返回為1,調(diào)用成功,事務(wù)提交
--
-- 測(cè)試方法
-- call pro_rep_shadow_rs(@rtn);
-- select @rtn;
----------------------------------
create procedure pro_rep_shadow_rs(out rtn int)
begin
-- 聲明變量,所有的聲明必須在非聲明的語(yǔ)句前面
declare iLast_rep_sync_id int default -1;
declare iMax_rep_sync_id int default -1;
-- 如果出現(xiàn)異常,或自動(dòng)處理并rollback,但不再通知調(diào)用方了
-- 如果希望應(yīng)用獲得異常,需要將下面這一句,以及啟動(dòng)事務(wù)和提交事務(wù)的語(yǔ)句全部去掉
declare exit handler for sqlexception rollback;
-- 查找上一次的
select eid into iLast_rep_sync_id from rep_de_proc_log where tbl='rep_shadow_rs';
-- 如果不存在,則增加一行
if iLast_rep_sync_id=-1 then
insert into rep_de_proc_log(rid,eid,tbl) values(0,0,'rep_shadow_rs');
set iLast_rep_sync_id = 0;
end if;
-- 下一個(gè)數(shù)字
set iLast_rep_sync_id=iLast_rep_sync_id+1;
-- 設(shè)置默認(rèn)的返回值為0:失敗
set rtn=0;
-- 啟動(dòng)事務(wù)
start transaction;
-- 查找最大編號(hào)
select max(rep_sync_id) into iMax_rep_sync_id from rep_shadow_rs;
-- 有新數(shù)據(jù)
if iMax_rep_sync_id>=iLast_rep_sync_id then
-- 調(diào)用
call pro_rep_shadow_rs_do(iLast_rep_sync_id,iMax_rep_sync_id);
-- 更新日志
update rep_de_proc_log set rid=iLast_rep_sync_id,eid=iMax_rep_sync_id where tbl='rep_shadow_rs';
end if;
-- 運(yùn)行沒(méi)有異常,提交事務(wù)
commit;
-- 設(shè)置返回值為1
set rtn=1;
end;
delimiter ;
drop procedure if exists pro_rep_shadow_rs_do;
delimiter |
---------------------------------
-- 處理指定編號(hào)范圍內(nèi)的數(shù)據(jù)
-- 需要輸入2個(gè)參數(shù)
-- last_rep_sync_id 是編號(hào)的最小值
-- max_rep_sync_id 是編號(hào)的最大值
-- 無(wú)返回值
---------------------------------
create procedure pro_rep_shadow_rs_do(last_rep_sync_id int, max_rep_sync_id int)
begin
declare iRep_operationtype varchar(1);
declare iRep_status varchar(1);
declare iRep_Sync_id int;
declare iId int;
-- 這個(gè)用于處理游標(biāo)到達(dá)最后一行的情況
declare stop int default 0;
-- 聲明游標(biāo)
declare cur cursor for select id,Rep_operationtype,iRep_status,rep_sync_id from rep_shadow_rs where rep_sync_id between last_rep_sync_id and max_rep_sync_id;
-- 聲明游標(biāo)的異常處理,設(shè)置一個(gè)終止標(biāo)記
declare CONTINUE HANDLER FOR SQLSTATE '02000' SET stop=1;
-- 打開(kāi)游標(biāo)
open cur;
-- 讀取一行數(shù)據(jù)到變量
fetch cur into iId,iRep_operationtype,iRep_status,iRep_Sync_id;
-- 這個(gè)就是判斷是否游標(biāo)已經(jīng)到達(dá)了最后
while stop <> 1 do
-- 各種判斷
if iRep_operationtype='I' then
insert into rs0811 (id,fnbm) select id,fnbm from rep_shadow_rs where rep_sync_id=iRep_sync_id;
elseif iRep_operationtype='U' then
begin
if iRep_status='A' then
insert into rs0811 (id,fnbm) select id,fnbm from rep_shadow_rs where rep_sync_id=iRep_sync_id;
elseif iRep_status='B' then
delete from rs0811 where id=iId;
end if;
end;
elseif iRep_operationtype='D' then
delete from rs0811 where id=iId;
end if;
-- 讀取下一行的數(shù)據(jù)
fetch cur into iId,iRep_operationtype,iRep_status,iRep_Sync_id;
end while; -- 循環(huán)結(jié)束
close cur; -- 關(guān)閉游標(biāo)
end;
相關(guān)文章
SQL實(shí)現(xiàn)數(shù)據(jù)過(guò)濾流程詳解
這篇文章主要介紹了SQL實(shí)現(xiàn)數(shù)據(jù)過(guò)濾流程,當(dāng)我們?cè)赟QL中查詢(xún)數(shù)據(jù)時(shí),肯定是有一些數(shù)據(jù)是我們不需要的,所以我們此時(shí)就要對(duì)數(shù)據(jù)進(jìn)行過(guò)濾,以篩選出我們僅需要的數(shù)據(jù)2023-01-01
Navicat導(dǎo)入mysql數(shù)據(jù)庫(kù)的圖文教程
本文主要介紹了Navicat導(dǎo)入mysql數(shù)據(jù)庫(kù)的圖文教程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
DataGrip連接Mysql并創(chuàng)建數(shù)據(jù)庫(kù)的方法實(shí)現(xiàn)
本文主要介紹了DataGrip連接Mysql并創(chuàng)建數(shù)據(jù)庫(kù)的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
Mysql導(dǎo)入導(dǎo)出時(shí)遇到的問(wèn)題解決
這篇文章主要給大家介紹了關(guān)于Mysql導(dǎo)入導(dǎo)出時(shí)遇到問(wèn)題的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Mysql具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
如何利用SSH隧道連接遠(yuǎn)程MySQL數(shù)據(jù)庫(kù)
為保護(hù)MySQL數(shù)據(jù)庫(kù)安全,可通過(guò)SSH隧道連接,服務(wù)端僅需開(kāi)放SSH端口,加強(qiáng)密碼策略,客戶(hù)端可使用Navicat等工具,或通過(guò)編程(如SpringBoot)實(shí)現(xiàn)端口轉(zhuǎn)發(fā),推薦使用密鑰建立SSH隧道,以免密碼泄露風(fēng)險(xiǎn),詳述了端口轉(zhuǎn)發(fā)的手動(dòng)設(shè)置方法及自動(dòng)化腳本配置2024-11-11
Mysql兩表聯(lián)合查詢(xún)的四種情況總結(jié)
今天小編就為大家分享一篇關(guān)于Mysql兩表聯(lián)合查詢(xún)的四種情況總結(jié),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01

