mysql - 游标的不一致行为

标签 mysql sql function cursor procedure

我有一个表 'dia'

table: dia

我有这个功能:

 create table log(
      cont int
 );

 delimiter //
 CREATE FUNCTION teste (calendario INT, data_selecionada DATE)
      RETURNS INT
 BEGIN

 DECLARE corrente INT DEFAULT 0;
 DECLARE data_inicio DATE DEFAULT NULL;
 DECLARE inicio INT DEFAULT 0;
 DECLARE maior_corrente INT DEFAULT 0;
 DECLARE existe_mais_linhas INT DEFAULT 0;
 DECLARE dia_atual DATE;
 DECLARE dia_anterior DATE DEFAULT NULL;
 DECLARE semana_atual INT DEFAULT -1;
 DECLARE semana_anterior INT DEFAULT -1;
 DECLARE total_vidas INT DEFAULT 0;
 DECLARE vidas INT DEFAULT 0;

 DECLARE meuCursor CURSOR FOR SELECT data, YEARWEEK(data), inicio_corrente FROM dia WHERE data >= data_selecionada and tem_corrente = 1 and calendario_id = calendario order by data asc;

 DECLARE CONTINUE HANDLER FOR NOT FOUND SET existe_mais_linhas=1;

 SELECT data into data_inicio FROM dia WHERE tem_corrente = 1 and inicio_corrente = 1 and data < data_selecionada order by data desc limit 1;

 OPEN meuCursor;

 meuLoop: LOOP
 FETCH meuCursor INTO dia_atual, semana_atual, inicio;
      insert into log (cont) values (1);

      IF existe_mais_linhas = 1 THEN
           LEAVE meuLoop;
      END IF;

 END LOOP meuLoop;

 CLOSE meuCursor;
 RETURN 0;

 END//
 delimiter ;

当我调用函数时:

 SELECT teste( 1,  '2014-01-26' )

表日志只包含一行...这是错误的,因为游标必须访问所有九行...但是,如果我删除该行:

 SELECT data into data_inicio FROM dia WHERE tem_corrente = 1 and inicio_corrente = 1 and data < data_selecionada order by data desc limit 1;"

(我认为这条线无关紧要)。但是现在,当我调用同一个函数时,表日志包含九行......那一行如何影响循环?

最佳答案

第一个查询没有返回任何数据..所以变量已经设置并且程序流继续..并且因为您在取消设置之前在循环中引用它..而不是像您预期的那样检查游标的无数据。 !!

 SELECT data into data_inicio FROM dia WHERE tem_corrente = 1 and inicio_corrente = 1 and data < data_selecionada order by data desc limit 1;


 IF existe_mais_linhas = 1 THEN
    SET existe_mais_linhas = 0;-- unset it using SET..
  END IF;

 OPEN meuCursor;

 meuLoop: LOOP
 FETCH meuCursor INTO dia_atual, semana_atual, inicio;

      IF existe_mais_linhas = 1 THEN
           LEAVE meuLoop;
      END IF;

       -- Move the insert after checking it!

      insert into log (cont) values (1);

 END LOOP meuLoop;

关于mysql - 游标的不一致行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21869598/

相关文章:

mysql - INSERT INTO 具有两列 UNIQUE INDEX 的表

mysql - 如何挑选价格高或低20%的产品?

sql - 动态创建列sql

java - 我可以使用 Selenium 打开应用程序吗?

Javascript:创建窗口的假副本以通过引用传递函数

javascript - 为什么点表示法对于函数变量输入参数 Javascript 无效

php - 在 AJAX 中执行带有变量参数的 php 脚本?

mysql - 在 ConstraintViolationException 导致 AssertionFailure 后 Hibernate session 无法查询

php - 包含特殊数字格式的字符串列的 AUTO_INCRMENT 实现

javascript - 简单参数 Javascript 函数