MySQL程序中的嵌套游标

时间:2017-01-10 12:48:21

标签: mysql stored-procedures nested-loops cursors

我需要针对某些条件迭代一个特定的表。在那个条件下它将返回一个行数据列表,我需要在过程中删除,但数据与多个其他表链接,所以我想到的do是在一个游标中获取所获取行的主键,并在我的第一次迭代中使用逗号连接它,并使用该连接列表我可以执行一次查询以从链接表中获取数据(使用FIND_IN_SET函数)...

我尝试了类似这样的事情并没有按预期工作......任何人都可以告诉我这是否可以做或者以其他方式做...

在这个例子中,                                                                                                                             有两个表scmn_sop_dtls和scmn_sop_addnl_dtls,这两个表有一个列的外键关系所以,我想要做的是我将从scmn_sop_dtls获取一些细节并插入记录表,我插入的是我需要的在scmn_sop_dtls表中删除。所以当我删除它是抛出外键关系错误,因为它与scmn_sop_addnl_dtls链接。所以首先我需要收集所有sopid和连接到列表和该列表我传递到第二个光标来获取子表中的特定行(scmn_sop_addnl_dtls)。但它并没有取得它们。

DELIMITER $$
USE `scmn_nov21`$$
DROP PROCEDURE IF EXISTS `MoveSampleData`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `MoveSampleData`()
BEGIN
Block1: BEGIN
DECLARE done INT DEFAULT 0;
DECLARE par_sop_id VARCHAR(50);
DECLARE par_sop_addnl_id VARCHAR(50);
DECLARE sopdl_sop_id_list VARCHAR(500);
DECLARE sopdl_sop_param_list VARCHAR(500);
DECLARE sopdl_temp_sop_param_list VARCHAR(500);
DECLARE sopdl_temp_sop_id VARCHAR(10);
DECLARE c_1 CURSOR FOR SELECT sop_id FROM scmn_sop_dtls WHERE created_date < NOW() - INTERVAL 1 MONTH;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN c_1;
REPEAT
FETCH c_1 INTO par_sop_id;
INSERT INTO record VALUES(par_sop_id,"Sub","Sop data","NIL",0,NOW());
  SET sopdl_temp_sop_id = CONCAT(par_sop_id, ',');
       SET sopdl_sop_id_list = CONCAT(sopdl_sop_id_list, sopdl_temp_sop_id);
Block2: BEGIN
DECLARE done2 INT DEFAULT 0;
DECLARE c_2 CURSOR FOR SELECT sop_addnl_id FROM scmn_sop_addnl_dtls WHERE FIND_IN_SET(sop_id,sopdl_sop_id_list);
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done2 = 1;
OPEN c_2;
REPEAT
FETCH c_2 INTO par_sop_addnl_id;
INSERT INTO record_arc VALUES(par_sop_addnl_id,"Sub","Sop data","NIL",0,NOW());
UNTIL done2 END REPEAT;
CLOSE c_2;
END Block2;
UNTIL done END REPEAT;
CLOSE c_1;
END Block1;
END$$

DELIMITER ;

0 个答案:

没有答案