Mysql的游標的界說應用及封閉深刻剖析。本站提示廣大學習愛好者:(Mysql的游標的界說應用及封閉深刻剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是Mysql的游標的界說應用及封閉深刻剖析正文
Mysql從5.0開端支撐存儲進程和trigger,給我們愛好用mysql的同伙們更愛好mysql的來由了,語法上和PL/SQL有差異,不外弄過編程的人都曉得,語法不是成績,症結是思惟,年夜致懂得語法後,就從變量界說,輪回,斷定,游標,異常處置這個幾個方面具體進修了。關於游標的用法Mysql如今供給的還很特殊,固然應用起來沒有PL/SQL那末隨手,不外應用上年夜致上照樣一樣,
界說游標
declare fetchSeqCursor cursor for select seqname, value from sys_sequence;
應用游標
open fetchSeqCursor;
fetch數據
fetch cursor into _seqname, _value;
封閉游標
close fetchSeqCursor;
不外這都是針對cursor的操作罷了,和PL/SQL沒有甚麼差別吧,不外光是懂得到這個是基本缺乏以寫出Mysql的fetch進程的,還要懂得其他的更深刻的常識,我們能力真實的寫出好的游標應用的procedure
起首fetch離不開輪回語句,那末先懂得一下輪回吧。
我普通應用Loop和while認為比擬清晰,並且代碼簡略。
這裡應用Loop為例
fetchSeqLoop:Loop
fetch cursor into _seqname, _value;
end Loop;
如今是逝世輪回,還沒有加入的前提,那末在這裡和oracle有差別,Oracle的PL/SQL的指針有個隱性變量%notfound,Mysql是經由過程一個Error handler的聲明來停止斷定的,
declare continue handler for Not found (do some action);
在Mysql裡當游標遍歷溢出時,會湧現一個預界說的NOT FOUND的Error,我們處置這個Error並界說一個continue的handler便可以叻,關於Mysql Error handler可以查詢Mysql手冊界說一個flag,在NOT FOUND,標示Flag,在Loop裡以這個flag為停止輪回的斷定便可以叻。
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;
這就是一個完全的進程叻,那末會思慮的人普通在這裡都邑思慮,假如是如許的話,如何做嵌套的游標輪回叻,這裡可以依據statement block的scope完成叻,Mysql裡經由過程begin end來劃分一個statement block,在block裡界說的變量規模也在這個block裡,所以關於嵌套的游標輪回我們可以多加一個begin end來辨別他們所對應的error handler(留意在Mysql裡統一個error的handler只能界說一次,多界說的話,在compile的進程中會提醒裡duplicate handler defination,所以NOT FOUND的handler就只能界說一次),在一個begin end裡界說這個外面游標的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;
如許便可以輕松完成更多條理的輪回了,不外絕對oracle的PL/SQL來講,Mysql如今還不支撐靜態游標的界說,所以很壯大的靜態拼出SQL的在游標裡還不克不及做到,不外這完整不影響我對Mysql的愛好水平,她就想那羞怯的荷花一樣,固然沒有殘暴的顏色,但那繁復的色彩,清爽而不染一絲鉛塵的文雅,一樣吸引著有數的mysql迷麼,正如接天蓮葉無限碧,映日荷花別樣紅。
付:Mysql也有相似Oracle裡的execute immediate的靜態SQL的功效,經由過程這個功效可有若干填補一些靜態游標的缺憾叻
set @sqlStr='select * from table where condition1 = ?';
prepare s1 for @sqlStr;
execute s1 using @condition1; 假如有多個參數用逗號分隔
deallocate prepare s1; 手工釋放,或許是connection封閉時,server主動收受接管。