我在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;
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;
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;
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
CLOSE cur2;
END
可是我的两个cursor中的东西毫不关联,而且也没有可比性。
也就是说,如果一个中已经没数据了,可是另一个才刚开始。那么会怎么样?
我记得
“DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;”
的意思是;当取不到数据就 SET done = 1;
也就是我的另一个中的数据还没有取完就被结束了。
那么谁见过/写过最NB的cursor,给几个例子看看。
也就是说,如果一个中已经没数据了,可是另一个才刚开始。那么会怎么样?
我记得
“DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;”
的意思是;当取不到数据就 SET done = 1;
也就是我的另一个中的数据还没有取完就被结束了。
那么谁见过/写过最NB的cursor,给几个例子看看。
因为我需要对一张表在insert后,判断并且操作另外的两张表。
(这个设计是不是太BT了,我也不想这样,被设计成这样了,所以这能适应了。)
需要用cursor吧把另外两张表的中的数据取出和insert的数据进行比较。
(这个设计是不是太BT了,我也不想这样,被设计成这样了,所以这能适应了。)
需要用cursor吧把另外两张表的中的数据取出和insert的数据进行比较。
本文出自 “老叶茶馆” 博客,转载请与作者联系!