MySQL Cursors:一个Trigger中,同时存在两个cursors的问题。

我在MySQl的帮助文档中看到游标可以嵌套使用:
CREATE PROCEDURE curdemo()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE a CHAR(16);
DECLARE b,c INT;
DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1;
DECLARE cur2 CURSOR FOR SELECT i FROM test.t2;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

OPEN cur1;
OPEN cur2;

REPEAT
FETCH cur1 INTO a, b;
FETCH cur2 INTO c;
IF NOT done THEN
IF b < c THEN
INSERT INTO test.t3 VALUES (a,b);
ELSE
INSERT INTO test.t3 VALUES (a,c);
END IF;
END IF;
UNTIL done END REPEAT;

CLOSE cur1;
CLOSE cur2;
END

可是我的两个cursor中的东西毫不关联,而且也没有可比性。
也就是说,如果一个中已经没数据了,可是另一个才刚开始。那么会怎么样?
我记得
“DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;”
的意思是;当取不到数据就 SET done = 1;
也就是我的另一个中的数据还没有取完就被结束了。
那么谁见过/写过最NB的cursor,给几个例子看看。

因为我需要对一张表在insert后,判断并且操作另外的两张表。
(这个设计是不是太BT了,我也不想这样,被设计成这样了,所以这能适应了。)
需要用cursor吧把另外两张表的中的数据取出和insert的数据进行比较。

Taxonomy upgrade extras:

我还没用过游标呢,谁搞过给解答一下吧。
不过我想lz自己测试一下就知道结果了 :)

MySQL方案、培训、支持

给你的祝福,要让你招架不住!

我的测试结果也是:只要是有一个的Data取完,结果就set done=1.

我见过的游标都是通过声明错误处理器来处理游标的:
DECLARE CONTINUE HANDLER FOR NOT FOUND 或者
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
好像两个的意思是一样的。
(第一个个CONTINUE处理没有引用SQL错误代码和SQLSTATE值。它使用的是NOT FOUND系统返回值,这和SQLSTATE 02000是一样的。)

是不是只能有一个:DECLARE CONTINUE HANDLER FOR NOT FOUND 出现?

那么是不是不能有太复杂的游标出现!
我也知道我的这个东东的要求也比较BT。

简单测试了一下,得出如下结论:

两个游标中只要任何一个取不到数据,那么 done = 1

不知道你的测试结果如何?

MySQL方案、培训、支持

给你的祝福,要让你招架不住!

不要把简单的问题搞复杂了, 使用一个cursor后, 在使用另一个cursor之前加一句 "SET done=0;", 让状态复位, 就可以再用于判断了。