假設(shè)A表有3個(gè)字段,ID, DATA1,DATA2
成都創(chuàng)新互聯(lián)公司堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都做網(wǎng)站、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿(mǎn)足客戶(hù)于互聯(lián)網(wǎng)時(shí)代的振安網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
簡(jiǎn)單的話(huà)可以不使用存儲(chǔ)過(guò)程,比如:
select * form A where ID in (select ID from A where DATA1 between 0 and 100)
如果你的應(yīng)用比較復(fù)雜,在嵌套中還有復(fù)雜的運(yùn)算,存儲(chǔ)過(guò)程可以如下例子:
CREATE PROCEDURE test(in_start int,in_end int)
BEGIN
DECLARE ids TEXT;
select GROUP_CONCAT(ID) into ids from A where DATA1 between in_start and in_end;
select * from A where FIND_IN_SET(ID,ids) 0;
END
注: in_start, in_end是DATA1的篩選范圍。 后面一個(gè)select直接返回一個(gè)表
直接用SQL和使用存儲(chǔ)過(guò)程各有利弊,存儲(chǔ)過(guò)程在你使用大量查詢(xún)及SQL運(yùn)算的時(shí)候效率很高,而且存儲(chǔ)過(guò)程一旦寫(xiě)入數(shù)據(jù)庫(kù)會(huì)被自動(dòng)編譯運(yùn)行速度比較快,而SQL是每次執(zhí)行都需要被編譯一次的。但是存儲(chǔ)過(guò)程的調(diào)試比較麻煩,不像你使用編程語(yǔ)言和SQL的時(shí)候可以單步調(diào)試。而且如果沒(méi)有熟練掌握存儲(chǔ)過(guò)程的效率優(yōu)化情況下,使用存儲(chǔ)過(guò)程可能比使用SQL更慢。
MySQL 存儲(chǔ)過(guò)程中,使用游標(biāo)查詢(xún),返回的是結(jié)果集時(shí),如何查看調(diào)用存儲(chǔ)過(guò)程輸出結(jié)果呢?
解決方案:存儲(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ǔ)句查詢(xún)臨時(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ò)程查詢(xún)臨時(shí)表輸出結(jié)果時(shí),會(huì)發(fā)現(xiàn)多循環(huán)了一次,像這樣:
解決方法:
在遍歷游標(biāo)查詢(xún)結(jié)果時(shí),先判斷游標(biāo)的結(jié)束標(biāo)志(done) 是否是為1,如果不是1,則向臨時(shí)表中插入數(shù)據(jù)。
主庫(kù)和從庫(kù)都直接可以查詢(xún)。
MySQL存儲(chǔ)過(guò)程-循環(huán)遍歷查詢(xún)到的結(jié)果集:根據(jù)MySQL的語(yǔ)法創(chuàng)建存儲(chǔ)過(guò)程,要注意的是如果循環(huán)遍歷查詢(xún)到的結(jié)果集,取出結(jié)果集中的數(shù)據(jù)做操作。
SELECT * FROM mysql.proc
WHERE type = 'PROCEDURE'
AND specific_name = 'P_UserBetDayDetail'
AND Body LIKE '%Report_UserBetDayDetail%';
mysql.proc:表示查詢(xún)的目標(biāo)表;
type = 'PROCEDURE':表示查詢(xún)的是存儲(chǔ)過(guò)程;
specific_name = 'P_UserBetDayDetail' :表示查詢(xún)的具體存儲(chǔ)過(guò)程名稱(chēng);
Body LIKE '%Report_UserBetDayDetail%':表示存儲(chǔ)過(guò)程內(nèi)容中包含的表。