2011-09-20 109 views
1

我開始嘗試熟悉MySQL中的存儲過程。從存儲過程返回一個結果集

我想知道是否可以逐步構建結果集 - 或者我需要使用臨時表嗎?

我的第一個鏡頭是

CREATE TEMPORARY TABLE t1 (id int); 

INSERT INTO t1 VALUES (1), (2), (3), (4); 

CREATE TEMPORARY TABLE t2 (id1 int, id2 int); 

INSERT INTO t2 VALUES (5,4),(3,2),(1,0),(12,34); 

DROP PROCEDURE IF EXISTS curdemo; 

delimiter // 

CREATE PROCEDURE curdemo() 
BEGIN 
    DECLARE done INT DEFAULT 0; 
    DECLARE a INT; 
    DECLARE b,c INT; 
    DECLARE cur1 CURSOR FOR SELECT id FROM t1 LIMIT 1000; 
    DECLARE cur2 CURSOR FOR SELECT id1, id2 FROM t2 LIMIT 1000; 
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; 

    OPEN cur1; 
    OPEN cur2; 
    -- 1 
    REPEAT 
    FETCH cur1 INTO a; 
    FETCH cur2 INTO b, c; 
    IF NOT done THEN 
     SELECT a, b, c; 
     -- 2 
    END IF; 
    UNTIL done END REPEAT; 

    CLOSE cur1; 
    CLOSE cur2; 
    -- 3 
END 

// 

DELIMITER ; 

這導致4結果組,每個組包含一行。我想要的是一個包含4行的結果集。

所以我添加

DROP TEMPORARY TABLE IF EXISTS tt; 
CREATE TEMPORARY TABLE tt (id1 int, id2 int, id3 int); 

INSERT INTO tt VALUES (a, b, c); 

SELECT * FROM tt; 
DROP TEMPORARY TABLE tt; 

在適當的地方(l-1,l-2 - 與更換SELECT和--3),和它的工作。

我現在的問題:是否有另一種方法呢?也許可以聲明一次結果集的形式,然後逐行「yield」,而不需要臨時表(及其臨時存儲分配)?

回答

1

你可以使用連接,像這樣只是將二者結合起來選擇:

SELECT id, id1, id2 FROM (
    SELECT @rank:= @rank+1 as rank1, t1.id, t2.id1, t2.id2 FROM t1 
    STRAIGHT JOIN (SELECT @rank:= 1) r 
    LEFT JOIN (SELECT @rank as rank2, id1, id2 FROM t2 LIMIT 1000) s 
    ON (rank1 = rank2) 
) s1 
+0

THX 4雅答案。在這個例子中這是可行的,但不是在一般情況下。 (然而,人們可以考慮其他的可能性)。但似乎沒有其他辦法可以做到這一點...... – glglgl