Mysql Cursor / Fetch - PullRequest
       8

Mysql Cursor / Fetch

0 голосов
/ 29 июня 2009

Я ожидаю, что следующая хранимая процедура возвратит серию строк, в то время как она возвращает только 1

CREATE PROCEDURE example()
    BEGIN
        DECLARE current_id INT;
        DECLARE done INT DEFAULT 0;
        DECLARE cur_main CURSOR FOR SELECT id from tasks;
        DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

        OPEN cur_main;

        FETCH cur_main into current_id;
        lp:WHILE not done DO
            FETCH cur_main into current_id;
            IF done = 1 THEN
                LEAVE lp;
            END IF;
            SELECT * from tasks WHERE id = current_id;
        END WHILE lp;

        CLOSE cur_main;
    END

Любая помощь? Это мой самый первый раз с хранимыми процедурами MySQL.

Ответы [ 4 ]

1 голос
/ 30 июня 2009

К сожалению, MySQL не возвращает несколько строк таким образом.

Эта процедура:

CREATE PROCEDURE example()
BEGIN
    SELECT 1;
    SELECT 2;
END;

вернет несколько наборов результатов, а не строк.

Не могли бы вы описать, какую задачу вы хотите решить с помощью этой хранимой процедуры?

0 голосов
/ 30 июня 2009

Спасибо за ваши ответы. Мне удалось сделать то, что я сделал, с помощью временной таблицы, в которую я ВСТАВИЛ все результаты, а затем ВЫБЕРИЛ * ИЗ этой таблицы.

0 голосов
/ 30 июня 2009

Вот еще одна возможность. Посмотрев еще раз на ваш код, я заметил, что вы делаете FETCH перед циклом while, который выдаст вам первую запись. Вы входите в цикл WHILE, а затем делаете еще один FETCH. Обычно вы входите в цикл while, выполняете обработку с текущей записью, а затем выполняете еще один FETCH прямо перед циклом цикла. Кроме того, переместив следующий FETCH в конец тела цикла, вы также можете удалить тест IF.

FETCH cur_main into current_id;
lp:WHILE not done DO
    SELECT * from tasks WHERE id = current_id;
    FETCH cur_main into current_id;
END WHILE lp;
0 голосов
/ 29 июня 2009

Возможно, вы захотите попробовать это утверждение, а не существующий тест.

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

Действие по умолчанию для обработчика продолжения - это EXIT для несоответствующего значения SQLSTATE. Константа «НЕ НАЙДЕНА» охватывает все действительные условия 020.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...