在MySQL中,使用CALL語句可以調(diào)用存儲(chǔ)過程或函數(shù)。這些存儲(chǔ)過程或函數(shù)可能返回多個(gè)結(jié)果集(result sets),那么我們需要想辦法將這些結(jié)果集合并(merge)起來,以便進(jìn)行處理。
一個(gè)簡(jiǎn)單的例子:
DELIMITER // CREATE PROCEDURE `example` () BEGIN SELECT * FROM `table1`; SELECT * FROM `table2`; SELECT * FROM `table3`; END// DELIMITER ;
在上述存儲(chǔ)過程中,我們查詢了三個(gè)表,并返回了三個(gè)結(jié)果集。如果直接調(diào)用該存儲(chǔ)過程:
CALL `example` ();
我們會(huì)得到三個(gè)獨(dú)立的結(jié)果集,如何合并它們呢?我們可以使用MySQL提供的SET語句和LEADING語句來處理。
SET語句用于設(shè)置變量,我們可以設(shè)置一個(gè)游標(biāo)變量(cursor variable)來存儲(chǔ)當(dāng)前結(jié)果集的指針位置。LEADING語句用于獲取下一個(gè)結(jié)果集,如果有下一個(gè)結(jié)果集,則返回TRUE,否則返回FALSE。
下面是一個(gè)示例代碼:
DECLARE cur CURSOR FOR SELECT * FROM `table1`; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN cur; REPEAT FETCH cur INTO ...; -- 處理當(dāng)前結(jié)果集 UNTIL done END REPEAT; LEADING cur; IF FOUND THEN REPEAT FETCH cur INTO ...; -- 處理下一個(gè)結(jié)果集 UNTIL NOT FOUND; END IF; CLOSE cur;
以上代碼中,我們使用了一個(gè)游標(biāo)變量cur來存儲(chǔ)當(dāng)前結(jié)果集的指針位置,類似于一個(gè)指針(pointer)。我們使用OPEN語句打開游標(biāo),然后使用REPEAT-UNTIL循環(huán)來處理當(dāng)前結(jié)果集,當(dāng)我們處理完當(dāng)前結(jié)果集時(shí),我們可以通過LEADING語句獲取下一個(gè)結(jié)果集,如果有下一個(gè)結(jié)果集,則FETCH語句將其讀入到游標(biāo)變量中,并繼續(xù)處理。
當(dāng)我們處理完所有結(jié)果集后,我們使用CLOSE語句關(guān)閉游標(biāo)變量。這樣,我們就完成了結(jié)果集的合并(merge)。