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的数据进行比较。
yejr
周一, 2007/03/26 - 17:45
Permalink
我还没用过游标呢,
我还没用过游标呢,谁搞过给解答一下吧。
不过我想lz自己测试一下就知道结果了 :)
MySQL方案、培训、支持
给你的祝福,要让你招架不住!
sxryan
周二, 2007/03/27 - 09:31
Permalink
我的测试结果也是:
我的测试结果也是:只要是有一个的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。
yejr
周一, 2007/03/26 - 18:07
Permalink
简单测试了一下,得
简单测试了一下,得出如下结论:
不知道你的测试结果如何?
MySQL方案、培训、支持
给你的祝福,要让你招架不住!
xjx922
周五, 2009/02/06 - 11:50
Permalink
不要把简单的问题搞
不要把简单的问题搞复杂了, 使用一个cursor后, 在使用另一个cursor之前加一句 "SET done=0;", 让状态复位, 就可以再用于判断了。