ОБЪЯВЛЯЙТЕ, ПРОДОЛЖАЙТЕ, ОБРАЩАЕТСЯ ЗА НЕ НАЙДЕН, не работает - PullRequest
2 голосов
/ 10 октября 2011

Привет, у меня есть следующая хранимая процедура

DROP PROCEDURE IF EXISTS `p25`$$

CREATE DEFINER=`root`@`%` PROCEDURE `p25`()
BEGIN
DECLARE b BOOLEAN;
DECLARE a VARCHAR(10);

DECLARE cur_1 CURSOR FOR SELECT t FROM sample_table;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET b = TRUE;

OPEN cur_1;
lbl:LOOP

IF b = TRUE THEN 
    LEAVE lbl;
END IF;
IF NOT b= TRUE THEN 
        FETCH cur_1 INTO a; 
END IF;

END LOOP;
CLOSE cur_1;
END$$

операторы выбора фактически возвращают 5 строк, но описанная выше процедура после выборки одной строки не проходит по другим строкам.и значение b никогда не устанавливается в true, и из-за этого оно собирается в бесконечный цикл.есть ли проблемы с моим кодом.пожалуйста, кто-нибудь, помогите мне ..

Я получил решение для этого, спасибо за помощь мне.я думаю, что способ проверки значений неправильный.Итак, теперь я хочу получить значения из некоторой другой таблицы в зависимости от выбранного значения строки.Как я могу напечатать результат, как || текущее значение строки ||значения, извлеченные из другой таблицы ||в результате для всех выбранных строк.

Ответы [ 2 ]

1 голос
/ 10 октября 2011

Попробуй поменять -

IF NOT b= TRUE THEN 
  FETCH cur_1 INTO a;

с -

IF b IS NULL THEN 
  FETCH cur_1 INTO a; 

Попробуйте этот код -

DECLARE b INT DEFAULT 0;
DECLARE a VARCHAR(10);

DECLARE cur_1 CURSOR FOR SELECT t FROM sample_table;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET b = 1;

OPEN cur_1;

REPEAT
  FETCH cur_1 INTO a;
  IF NOT b THEN
    -- do something:
    ...
    ...
    ...
  END IF;
UNTIL b END REPEAT;

CLOSE cur_1;
0 голосов
/ 31 января 2019

Одной из причин может быть то, что вы могли снова использовать операторы select into внутри вашего курсора, который устанавливает значение вашего обработчика равным 1 для этих вложенных операторов select внутри цикла курсора.Вы можете сбросить значение обработчика до 0 после операторов выбора, используемых внутри, и переместить условие обработчика непосредственно рядом с командой FETCH.Пример:

...
BEGIN
DECLARE cursor_finished INTEGER DEFAULT 0;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET cursor_finished = 1;
...
open table_cursor;
get_row: LOOP
  FETCH table_cursor INTO v_variable1, v_variable3;
  IF cursor_finished = 1 THEN 
    LEAVE get_row;
  END IF;
  ....
  Select id into v_id from sometable; -- this sets cursor_finished to 1.
  SET cursor_finished = 0; -- hence reset this value for cursor.
  ....
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...