Mysql的游標(biāo)的定義使用及關(guān)閉深入分析
更新時(shí)間:2012年12月18日 17:40:57 作者:
于游標(biāo)的用法Mysql現(xiàn)在提供的還很特別,雖然使用起來沒有PL/SQL那么順手,不過使用上大致上還是一樣,本文將詳細(xì)介紹一下,需要了解的朋友可以參考下
Mysql從5.0開始支持存儲過程和trigger,給我們喜歡用mysql的朋友們更喜歡mysql的理由了,語法上和PL/SQL有差別,不過搞過編程的人都知道,語法不是問題,關(guān)鍵是思想,大致了解語法后,就從變量定義,循環(huán),判斷,游標(biāo),異常處理這個(gè)幾個(gè)方面詳細(xì)學(xué)習(xí)了。關(guān)于游標(biāo)的用法Mysql現(xiàn)在提供的還很特別,雖然使用起來沒有PL/SQL那么順手,不過使用上大致上還是一樣,
定義游標(biāo)
declare fetchSeqCursor cursor for select seqname, value from sys_sequence;
使用游標(biāo)
open fetchSeqCursor;
fetch數(shù)據(jù)
fetch cursor into _seqname, _value;
關(guān)閉游標(biāo)
close fetchSeqCursor;
不過這都是針對cursor的操作而已,和PL/SQL沒有什么區(qū)別吧,不過光是了解到這個(gè)是根本不足以寫出Mysql的fetch過程的,還要了解其他的更深入的知識,我們才能真正的寫出好的游標(biāo)使用的procedure
首先fetch離不開循環(huán)語句,那么先了解一下循環(huán)吧。
我一般使用Loop和while覺得比較清楚,而且代碼簡單。
這里使用Loop為例
fetchSeqLoop:Loop
fetch cursor into _seqname, _value;
end Loop;
現(xiàn)在是死循環(huán),還沒有退出的條件,那么在這里和oracle有區(qū)別,Oracle的PL/SQL的指針有個(gè)隱性變量%notfound,Mysql是通過一個(gè)Error handler的聲明來進(jìn)行判斷的,
declare continue handler for Not found (do some action);
在Mysql里當(dāng)游標(biāo)遍歷溢出時(shí),會(huì)出現(xiàn)一個(gè)預(yù)定義的NOT FOUND的Error,我們處理這個(gè)Error并定義一個(gè)continue的handler就可以叻,關(guān)于Mysql Error handler可以查詢Mysql手冊定義一個(gè)flag,在NOT FOUND,標(biāo)示Flag,在Loop里以這個(gè)flag為結(jié)束循環(huán)的判斷就可以叻。
declare fetchSeqOk boolean; ## define the flag for loop judgement
declare _seqname varchar(50); ## define the varient for store the data
declare _value bigint(20);
declare fetchSeqCursor cursor for select seqname, value from sys_sequence;## define the cursor
declare continue handler for NOT FOUND set fetchSeqOk = true; ## define the continue handler for not
found flag
set fetchSeqOk = false;
open fetchSeqCursor;
fetchSeqLoop:Loop
if fetchSeqOk then
leave fetchSeqLoop;
else
fetch cursor into _seqname, _value;
select _seqname, _value;
end if;
end Loop;
close fetchSeqCursor;
這就是一個(gè)完整的過程叻,那么會(huì)思考的人一般在這里都會(huì)思考,如果是這樣的話,怎樣做嵌套的游標(biāo)循環(huán)叻,這里可以根據(jù)statement block的scope實(shí)現(xiàn)叻,Mysql里通過begin end來劃分一個(gè)statement block,在block里定義的變量范圍也在這個(gè)block里,所以關(guān)于嵌套的游標(biāo)循環(huán)我們可以多加一個(gè)begin end來區(qū)分他們所對應(yīng)的error handler(注意在Mysql里同一個(gè)error的handler只能定義一次,多定義的話,在compile的過程中會(huì)提示里duplicate handler defination,所以NOT FOUND的handler就只能定義一次),在一個(gè)begin end里定義這個(gè)里面游標(biāo)的NOT FOUND handler,
declare fetchSeqOk boolean; ## define the flag for loop judgement
declare _seqname varchar(50); ## define the varient for store the data
declare _value bigint(20);
declare fetchSeqCursor cursor for select seqname, value from sys_sequence;## define the cursor
declare continue handler for NOT FOUND set fetchSeqOk = true; ## define the continue handler for not
found flag
set fetchSeqOk = false;
open fetchSeqCursor;
fetchSeqLoop:Loop
if fetchSeqOk then
leave fetchSeqLoop;
else
fetch cursor into _seqname, _value;
begin
declare fetchSeqOk boolean default 'inner';
declare cursor2 cursor for select .... from ...;## define the cursor
declare continue handler for NOT FOUND set fetchSeqOk = true; ## define the continue handler for n
ot
set fetchSeqOk = false;
open cursor2;
fetchloop2 loop
if fetchSeqOk then
else
end if;
end loop;
close cursor2;
end;
end if;
end Loop;
close fetchSeqCursor;
這樣就可以輕松實(shí)現(xiàn)更多層次的循環(huán)了,不過相對oracle的PL/SQL來說,Mysql現(xiàn)在還不支持動(dòng)態(tài)游標(biāo)的定義,所以很強(qiáng)大的動(dòng)態(tài)拼出SQL的在游標(biāo)里還不能做到,不過這完全不影響我對Mysql的喜愛程度,她就想那羞澀的荷花一樣,雖然沒有燦爛的色彩,但那簡約的色調(diào),清新而不染一絲鉛塵的高雅,一樣吸引著無數(shù)的mysql迷么,正如接天蓮葉無窮碧,映日荷花別樣紅。
付:Mysql也有類似Oracle里的execute immediate的動(dòng)態(tài)SQL的功能,通過這個(gè)功能可有多少彌補(bǔ)一些動(dòng)態(tài)游標(biāo)的缺憾叻
set @sqlStr='select * from table where condition1 = ?';
prepare s1 for @sqlStr;
execute s1 using @condition1; 如果有多個(gè)參數(shù)用逗號分隔
deallocate prepare s1; 手工釋放,或者是connection關(guān)閉時(shí),server自動(dòng)回收。
定義游標(biāo)
declare fetchSeqCursor cursor for select seqname, value from sys_sequence;
使用游標(biāo)
open fetchSeqCursor;
fetch數(shù)據(jù)
fetch cursor into _seqname, _value;
關(guān)閉游標(biāo)
close fetchSeqCursor;
不過這都是針對cursor的操作而已,和PL/SQL沒有什么區(qū)別吧,不過光是了解到這個(gè)是根本不足以寫出Mysql的fetch過程的,還要了解其他的更深入的知識,我們才能真正的寫出好的游標(biāo)使用的procedure
首先fetch離不開循環(huán)語句,那么先了解一下循環(huán)吧。
我一般使用Loop和while覺得比較清楚,而且代碼簡單。
這里使用Loop為例
復(fù)制代碼 代碼如下:
fetchSeqLoop:Loop
fetch cursor into _seqname, _value;
end Loop;
現(xiàn)在是死循環(huán),還沒有退出的條件,那么在這里和oracle有區(qū)別,Oracle的PL/SQL的指針有個(gè)隱性變量%notfound,Mysql是通過一個(gè)Error handler的聲明來進(jìn)行判斷的,
declare continue handler for Not found (do some action);
在Mysql里當(dāng)游標(biāo)遍歷溢出時(shí),會(huì)出現(xiàn)一個(gè)預(yù)定義的NOT FOUND的Error,我們處理這個(gè)Error并定義一個(gè)continue的handler就可以叻,關(guān)于Mysql Error handler可以查詢Mysql手冊定義一個(gè)flag,在NOT FOUND,標(biāo)示Flag,在Loop里以這個(gè)flag為結(jié)束循環(huán)的判斷就可以叻。
復(fù)制代碼 代碼如下:
declare fetchSeqOk boolean; ## define the flag for loop judgement
declare _seqname varchar(50); ## define the varient for store the data
declare _value bigint(20);
declare fetchSeqCursor cursor for select seqname, value from sys_sequence;## define the cursor
declare continue handler for NOT FOUND set fetchSeqOk = true; ## define the continue handler for not
found flag
set fetchSeqOk = false;
open fetchSeqCursor;
fetchSeqLoop:Loop
if fetchSeqOk then
leave fetchSeqLoop;
else
fetch cursor into _seqname, _value;
select _seqname, _value;
end if;
end Loop;
close fetchSeqCursor;
這就是一個(gè)完整的過程叻,那么會(huì)思考的人一般在這里都會(huì)思考,如果是這樣的話,怎樣做嵌套的游標(biāo)循環(huán)叻,這里可以根據(jù)statement block的scope實(shí)現(xiàn)叻,Mysql里通過begin end來劃分一個(gè)statement block,在block里定義的變量范圍也在這個(gè)block里,所以關(guān)于嵌套的游標(biāo)循環(huán)我們可以多加一個(gè)begin end來區(qū)分他們所對應(yīng)的error handler(注意在Mysql里同一個(gè)error的handler只能定義一次,多定義的話,在compile的過程中會(huì)提示里duplicate handler defination,所以NOT FOUND的handler就只能定義一次),在一個(gè)begin end里定義這個(gè)里面游標(biāo)的NOT FOUND handler,
復(fù)制代碼 代碼如下:
declare fetchSeqOk boolean; ## define the flag for loop judgement
declare _seqname varchar(50); ## define the varient for store the data
declare _value bigint(20);
declare fetchSeqCursor cursor for select seqname, value from sys_sequence;## define the cursor
declare continue handler for NOT FOUND set fetchSeqOk = true; ## define the continue handler for not
found flag
set fetchSeqOk = false;
open fetchSeqCursor;
fetchSeqLoop:Loop
if fetchSeqOk then
leave fetchSeqLoop;
else
fetch cursor into _seqname, _value;
begin
declare fetchSeqOk boolean default 'inner';
declare cursor2 cursor for select .... from ...;## define the cursor
declare continue handler for NOT FOUND set fetchSeqOk = true; ## define the continue handler for n
ot
set fetchSeqOk = false;
open cursor2;
fetchloop2 loop
if fetchSeqOk then
else
end if;
end loop;
close cursor2;
end;
end if;
end Loop;
close fetchSeqCursor;
這樣就可以輕松實(shí)現(xiàn)更多層次的循環(huán)了,不過相對oracle的PL/SQL來說,Mysql現(xiàn)在還不支持動(dòng)態(tài)游標(biāo)的定義,所以很強(qiáng)大的動(dòng)態(tài)拼出SQL的在游標(biāo)里還不能做到,不過這完全不影響我對Mysql的喜愛程度,她就想那羞澀的荷花一樣,雖然沒有燦爛的色彩,但那簡約的色調(diào),清新而不染一絲鉛塵的高雅,一樣吸引著無數(shù)的mysql迷么,正如接天蓮葉無窮碧,映日荷花別樣紅。
付:Mysql也有類似Oracle里的execute immediate的動(dòng)態(tài)SQL的功能,通過這個(gè)功能可有多少彌補(bǔ)一些動(dòng)態(tài)游標(biāo)的缺憾叻
set @sqlStr='select * from table where condition1 = ?';
prepare s1 for @sqlStr;
execute s1 using @condition1; 如果有多個(gè)參數(shù)用逗號分隔
deallocate prepare s1; 手工釋放,或者是connection關(guān)閉時(shí),server自動(dòng)回收。
您可能感興趣的文章:
- 如何優(yōu)雅、安全的關(guān)閉MySQL進(jìn)程
- 怎樣安全地關(guān)閉MySQL實(shí)例
- 安全地關(guān)閉MySQL服務(wù)的教程
- MySQL關(guān)閉過程詳解和安全關(guān)閉MySQL的方法
- 如何解決mysql無法關(guān)閉的問題
- Windows下使用批處理實(shí)現(xiàn)啟動(dòng)關(guān)閉mysql
- MySQL數(shù)據(jù)庫開啟、關(guān)閉、查看函數(shù)功能的方法
- lnmp關(guān)閉mysql日志保護(hù)硬盤空間的方法
- MySQL服務(wù)器的啟動(dòng)和關(guān)閉
- 如何安全地關(guān)閉MySQL
相關(guān)文章
mysql導(dǎo)入csv的4種報(bào)錯(cuò)的解決方法
這篇文章主要介紹了mysql導(dǎo)入csv的4種報(bào)錯(cuò)的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12mysql跨服務(wù)查詢之FEDERATED存儲引擎的實(shí)現(xiàn)
本文主要介紹了mysql跨服務(wù)查詢之FEDERATED存儲引擎的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01使用xtrabackup實(shí)現(xiàn)mysql備份
Xtrabackup 是percona公司的開源項(xiàng)目,用以實(shí)現(xiàn)類似innodb官方的熱備份工具InnoDB Hot Backup的功能,能夠非常快速地備份與恢復(fù)MySQL數(shù)據(jù)庫。今天我們就來詳細(xì)討論下Xtrabackup的使用方法2016-11-11MySQL中的LOCATE和POSITION函數(shù)使用方法
不常用:MySQL中的LOCATE和POSITION函數(shù)2010-02-02