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