MySQL 存儲(chǔ)過(guò)程中,使用游標(biāo)查詢,返回的是結(jié)果集時(shí),如何查看調(diào)用存儲(chǔ)過(guò)程輸出結(jié)果呢?
響水網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián),響水網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為響水上千多家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站制作要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的響水做網(wǎng)站的公司定做!
解決方案:存儲(chǔ)過(guò)程不返回?cái)?shù)據(jù),但它能創(chuàng)建和填充另一個(gè)表。所以在存儲(chǔ)過(guò)程運(yùn)行中創(chuàng)建臨時(shí)表。該臨時(shí)表將保存存儲(chǔ)過(guò)程中生成的結(jié)果集,在遍歷游標(biāo)時(shí),用insert保存每條數(shù)據(jù)到臨時(shí)表中。后續(xù)調(diào)用時(shí)可以用select語(yǔ)句查詢臨時(shí)表中的存儲(chǔ)過(guò)程運(yùn)行結(jié)果。
以下有 三種方式 使用游標(biāo)創(chuàng)建一個(gè)存儲(chǔ)過(guò)程,統(tǒng)計(jì)某一部門(mén)下的員工信息
方法一:Loop循環(huán)
調(diào)用存儲(chǔ)過(guò)程:
方法二:While 循環(huán)
調(diào)用存儲(chǔ)過(guò)程:
方法三:REPEAT 循環(huán)
調(diào)用存儲(chǔ)過(guò)程:
上述三種實(shí)現(xiàn)方法在測(cè)試過(guò)程中遇到下述問(wèn)題。
調(diào)用存儲(chǔ)過(guò)程查詢臨時(shí)表輸出結(jié)果時(shí),會(huì)發(fā)現(xiàn)多循環(huán)了一次,像這樣:
解決方法:
在遍歷游標(biāo)查詢結(jié)果時(shí),先判斷游標(biāo)的結(jié)束標(biāo)志(done) 是否是為1,如果不是1,則向臨時(shí)表中插入數(shù)據(jù)。
先聲明一個(gè)游標(biāo),語(yǔ)法:
DECLARE v_1 VARCHAR(16);
DECLARE v_2 VARCHAR(16);
DECLARE c_XXX CURSOR FOR
SELECT c_1, c_2
FROM t_1;
同時(shí)聲明一個(gè)布爾型的變量FOUND,當(dāng)循環(huán)的條件不成立時(shí),結(jié)束循環(huán)用的。
DECLARE FOUND BOOLEAN DEFAULT TRUE;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET FOUND = FALSE;
在使用游標(biāo)的時(shí)候,要先打開(kāi)游標(biāo),語(yǔ)法:OPEN c_XXX;
使用的時(shí)候,要先打開(kāi)游標(biāo),取出第一條數(shù)據(jù),語(yǔ)法: FETCH c_XXX INTO v_1, v_2;
然后才開(kāi)始執(zhí)行循環(huán),語(yǔ)法:WHILE FOUND DO
執(zhí)行需要執(zhí)行的語(yǔ)句;
取下一條數(shù)據(jù)放到當(dāng)前游標(biāo)中,F(xiàn)ETCH c_XXX INTO v_1, v_2;
結(jié)束循環(huán),語(yǔ)法:END WHILE;
結(jié)束游標(biāo),語(yǔ)法:CLOSE c_cargo。有什么問(wèn)題我們?cè)贉贤ò 2恢滥憔唧w要問(wèn)題的是什么。
cursor_sharing string EXACT
cursor_space_for_time boolean TRUE
open_cursors integer 300
session_cached_cursors integer 0
游標(biāo)超出一般是由于應(yīng)用中沒(méi)有關(guān)閉游標(biāo)造成的