У меня есть prosedure, который, судя по обновлению некоторой информации. в таблице, но. его выполнение. некоторые это сочтет неправильными и нет. обновление. мой. Таблица
CREATE DEFINER='andrey.'@'ip' PROCEDURE 'sp_visits'()
BEGIN
DECLARE cursor_VAL VARCHAR(255);
DECLARE done INT DEFAULT FALSE;
DECLARE min_date DATETIME DEFAULT FALSE;
DECLARE max_visits INT DEFAULT FALSE;
DECLARE cursor_i CURSOR FOR SELECT hash_id FROM .ANDREY;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cursor_i;
read_loop: LOOP
FETCH cursor_i INTO cursor_VAL;
IF done THEN
LEAVE read_loop;
END IF;
select @max_visits := max(visits)
from ANDREY where hash_id = cursor_VAL ;
select @min_date :=min(date(transaction_ts))
from ANDREY where hash_id = cursor_VAL and visits =@max_visits;
update ANDREYt
set visits = @max_visits+1
where hash_id = cursor_VAL and date(transaction_ts) between date(@min_date) and DATE(@min_date) + INTERVAL 7 DAY;
END LOOP;
CLOSE cursor_i;
END
когда я запускаю его из workbench, вместо того чтобы запускать его, возвратите мне несколько записей # @min_date: = min (date (transaction_ts)) 2018-07-20
Я не понимаю, почему, потому что я не указал возврат для этой процедуры, также не понимаю, почему ее не обновляет мою таблицу, когда я запускаю инструкции вручную, а не в процедурной логике, но не в процедуре. Есть идеи?
Когда вы делаете такие вещи, как:
select @max_visits := max(visits)
from ANDREY where hash_id = cursor_VAL ;
в процедуре результат этого запроса возвращается в результате процедуры. Вы можете решить эту проблему, используя SELECT INTO
:
SELECT MAX(visits) INTO @max_visits
FROM ANDREY where hash_id = cursor_VAL ;
SELECT MIN(DATE(transaction_ts) INTO @min_date
FROM ANDREY where hash_id = cursor_VAL AND visits = @max_visits;
SELECT
в процедуре вернет выбранные строки.@max_visits
/max_visits
и@min_date
/min_date
, см. 9.4 Пользовательские переменные и 13.6.4 Переменные в хранимых программах .