Mysql Cursor / Fetch

0

Я ожидаю, что следующая сохраненная процедура вернет серию строк, в то время как она возвращает только 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 хранимыми процедурами.

Теги:
stored-procedures

4 ответа

1

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

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

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

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

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

0

Спасибо за ответы. Мне удалось сделать то, что я сделал, с помощью временной таблицы, где я INSERT все результаты, а затем SELECTING * FROM этой таблицы.

0

Вот еще одна возможность. Еще раз взглянув на ваш код, я заметил, что вы делаете 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

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

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

Действие по умолчанию для обработчика продолжения - EXIT для непревзойденного значения SQLSTATE. Константа "NOT FOUND" охватывает все допустимые условия 020.

  • 0
    Тем не менее он возвращает тот же единственный ряд ..

Ещё вопросы

Сообщество Overcoder
Наверх
Меню