2010-01-18 55 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