gpt4 book ai didi

mysql - 游标的不一致行为

转载 作者:行者123 更新时间:2023-11-29 00:18:45 25 4
gpt4 key购买 nike

我有一个表 '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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com