2010-01-18 62 views
0

這裏是我寫的程序 - 遊標c1 & c2c2裏面c1,我試着聲明c2以下c1(在c1遊標外),但是I未服用的更新值:(任何建議,使它的工作將是有益的,感謝mysql動態光標

create table t1(i int); 

create table t2(i int, j int); 

insert into t1(i) values(1), (2), (3), (4), (5); 

insert into t2(i, j) values(1, 6), (2, 7), (3, 8), (4, 9), (5, 10); 

delimiter $ 

CREATE PROCEDURE p1() 
BEGIN 
DECLARE I INT; 
DECLARE J INT; 
DECLARE done INT DEFAULT 0; 

DECLARE c1 CURSOR FOR SELECT i FROM t1; 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 

OPEN c1; 
REPEAT 
    FETCH c1 INTO I; 

    IF NOT done THEN 

     select I; 

     DECLARE c2 CURSOR FOR 
      SELECT j FROM t2 WHERE i = I; 

     OPEN c2; 
     REPEAT 
      FETCH c2 into J; 

      IF NOT done THEN 
       SELECT J; 
      END IF; 
     UNTIL done END REPEAT; 
     CLOSE c2; 

     set done = 0; 

    END IF; 

UNTIL done END REPEAT; 

CLOSE c1; 

END$ 

delimiter ; 

回答

1

我不瞭解你想要做什麼當你在一個程序中一次選擇一個字段時,你正在創建多個結果集,我懷疑這是你想要的結果,

下面的過程非常簡單,單個結果集中的相同數據:

CREATE PROCEDURE p1() 
BEGIN 
    SELECT i, j FROM t1 JOIN t2 USING (i); 
END 

也許你可以編輯你的問題並描述你想要的結果,或者顯示所需輸出的例子。

+0

謝謝比爾。是的,我們可以使用連接,但我的問題是我們可以做同樣的事情,而不使用連接,但使用兩個遊標。 有時,在這種情況下,JOIN可能會非常昂貴,解決方案是什麼? – user237865 2010-02-03 11:02:02

+1

加入是昂貴的,這是一個神話。當然,它的效率遠高於* N + 1 *'SELECT'查詢的效率。 – 2010-02-03 14:48:06