Mysql游标未运行嵌套循环

标签 mysql sql database plsql cursor

我创建了两个游标,用于循环遍历外循环中的每个值并遍历整个内循环。所以我创建了以下嵌套游标。但是当我的一个表有一行数据时它会起作用。然后我在第一个表中插入更多数据,但游标无法正常工作

 BEGIN
DECLARE done int default false;
DECLARE a,b varchar(20);
DECLARE c,d date;
DECLARE f,j text;
DECLARE cur2 CURSOR FOR SELECT tran_id,tran_date FROM bank_tran where tcheck='NO'; 
DECLARE cur1 CURSOR FOR SELECT stran_id,stran_date,scheck FROM student_tran; 
 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 
 OPEN cur1;
  read_loop: LOOP
    FETCH cur1 INTO a,c,j;
    IF done THEN
         LEAVE read_loop;
      END IF;
    OPEN cur2;
    inside_loop:LOOP
      FETCH cur2 INTO b,d;
      IF done THEN
         LEAVE inside_loop;
      END IF;
      IF (a = b) and (c=d) THEN
        update student_tran set valid='YES',scheck='YES' where stran_id=a;
        update bank_tran set matched_sub_id=a ,tcheck='YES' where tran_id=a;
       CLOSE cur2;
      LEAVE inside_loop;
      ELSE
         ITERATE inside_loop;
      END IF;
    END LOOP inside_loop;

    END LOOP read_loop ;
  CLOSE cur1;
  END

我在游标中使用的两个表的结构是

CREATE TABLE IF NOT EXISTS `bank_tran` (
  `tran_id` varchar(20) NOT NULL,
  `tran_date` date NOT NULL,
  `tcheck` text NOT NULL,
  `matched_sub_id` varchar(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


CREATE TABLE IF NOT EXISTS `student_tran` (
  `student_id` varchar(20) NOT NULL,
  `sub_apply_id` varchar(20) NOT NULL,
  `stran_id` varchar(20) NOT NULL,
  `stran_date` date NOT NULL,
  `scheck` text NOT NULL,
  `valid` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

两个表的一些数据是

    INSERT INTO `bank_tran` (`tran_id`, `tran_date`, `tcheck`, `matched_sub_id`) VALUES

    ('4HZZGl', '2015-02-03', 'NO', ''),
    ('LkvUG5', '2015-02-03', 'NO', ''),
    ('fKbl8H', '2015-02-03', 'NO', ''),
    ('fIS7kg', '2015-02-03', 'NO', ''),
    ('GQqBic', '2015-02-03', 'NO', ''),
    ('ZPU3Yx', '2015-02-03', 'NO', ''),
    ('gKSNz7', '2015-02-03', 'NO', ''),
    ('DeyvKU', '2015-02-03', 'NO', ''),
    ('pKarTd', '2015-02-03', 'NO', ''),
    ('nVbJkW', '2015-02-03', 'NO', ''),
    ('1EuzDN', '2015-02-03', 'NO', ''),
    ('QrIxQD', '2015-02-03', 'NO', ''),
    ('vHtJID', '2015-02-03', 'NO', ''),
    ('cQzbYy', '2015-02-03', 'NO', ''),
    ('MGhWy0', '2015-02-03', 'NO', ''),
    ('6DDsSH', '2015-02-03', 'NO', '');
INSERT INTO `student_tran` (`student_id`, `sub_apply_id`, `stran_id`, `stran_date`, `scheck`, `valid`) VALUES
('', '', '4HZZGl', '2015-02-03', 'NO', ''),
('', '', 'LkvUG5', '2015-02-03', 'NO', ''),
('', '', 'fKbl8H', '2015-02-03', 'NO', ''),
('', '', 'fIS7kg', '2015-02-03', 'NO', ''),
('', '', 'GQqBic', '2015-02-03', 'NO', ''),
('', '', 'ZPU3Yx', '2015-02-03', 'NO', ''),
('', '', 'gKSNz7', '2015-02-03', 'NO', ''),
('', '', 'DeyvKU', '2015-02-03', 'NO', ''),
('', '', 'pKarTd', '2015-02-03', 'NO', ''),
('', '', 'nVbJkW', '2015-02-03', 'NO', ''),
('', '', '1EuzDN', '2015-02-03', 'NO', ''),
('', '', 'QrIxQD', '2015-02-03', 'NO', ''),
('', '', 'vHtJID', '2015-02-03', 'NO', ''),
('', '', 'cQzbYy', '2015-02-03', 'NO', ''),
('', '', 'MGhWy0', '2015-02-03', 'NO', ''),
('', '', '6DDsSH', '2015-02-03', 'NO', '');

我正在做的是,如果在学生交易表中 stran_id 有效或无效,则将相应的bank_trans的matched_sub_id设置为stran_id(目前仅查看其是否有效)。我是pl初学者/sql编程

最佳答案

BEGIN
DECLARE done int default false;
DECLARE a,b varchar(20);
DECLARE c,d date;
DECLARE f,j text;
DECLARE cur2 CURSOR FOR SELECT tran_id,tran_date FROM bank_tran where tcheck='NO';
DECLARE cur1 CURSOR FOR SELECT stran_id,stran_date,scheck FROM student_tran where scheck='NO'; 
 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 
 OPEN cur1;
  read_loop: LOOP
    FETCH cur1 INTO a,c,j;
    IF done THEN
         LEAVE read_loop;
    END IF;
    OPEN cur2;
    inside_loop:LOOP
      FETCH cur2 INTO b,d;
       IF done THEN
         LEAVE inside_loop;
       END IF;
      IF (a = b) and (c=d) THEN
        update student_tran set valid='YES',scheck='YES' where stran_id=a;
        update bank_tran set matched_sub_id=a ,tcheck='YES' where tran_id=a;
        CLOSE cur2;
      LEAVE inside_loop;
      ELSE
         ITERATE inside_loop;
      END IF;
    END LOOP inside_loop;
   END LOOP read_loop ;
  CLOSE cur1;
END

只需在 cur1 中添加 where 子句即可。它现在可以工作,检查一下。

关于Mysql游标未运行嵌套循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29734800/

相关文章:

sql - 在Hive的查询端解析日期整数

mysql - sql : Side effects of creating/deleting databases and tables on the fly

php - MySQL表分离几乎相同的数据但不同的用户组

php - 使用 php 在 href 中放置变量时出错

mysql - sum 函数不正确的值和本月尚未付款的列表

mysql - 在条件语句中使用默认值时出错

sql - 从星期一到星期日按星期几排序

sql - ActiveRecord 查询,按关联排序,has_many 的最后一个

sql-server - 我怎样才能得到没有外键约束的列表?

php - 根据计算值查找所有重复项的列表