Как стать автором
Обновить

Комментарии 13

используйте habracut
исправил
Забавно. Прямо сейчас прохожу курс про использование курсоров в PL/SQL, отвлёкся на хабр, а тут бац — и та же тема :)
Спасибо, полезная информация. Впрочем, не могу не отметить, что в mysql такие вещи все же как-то выглядят немного недоделанными: вот pl/pgsql, например, аналогичные вещи можно вполне спокойно делать, не беспокоясь об SQLSTATE.
Если брать тот же Oracle, то там и конструкция обхода не через While, а через For, при этом каждое поле не в отдельную переменную читается, а является объектом строки(записи). Конечно это удобней и продуманней, но как есть так есть, и придется с этим смириться.
В interbase/firebird курсоры тоже используются через for. Проще, удобнее. Нет такого жуткого нагромождения объявлений.

PS
У хранимых процедур появился серьезный враг — «Кроссбазаданные» фрефмворки типа SQLAlchemy (Python), ActiveRecord (Ruby) которые потихонечку сводят на нет необходимость знания тонкостей построения запросов.
Эти фрэйворки абсолютно не грозят процедурам, т.к. скорость выполнения обычных запросов все равно останется ниже выполнения аналогичной процедуры на время компиляции запроса.

К тому же, использование подобных фрэйворков начинающим программистам только вредит, т.к. приводит к тому, что без них с базой не могут потом работать!
То же самое хотел сказать, просто по другому (неудачно) выразился…
Взять и написать хранимую процедуру, или даже просто соптимизировать запрос «всю жизнь» пользуясь фремврками очень сложно.
Кому как, а мне наоборот понравилось больше сделать некоторую базовую логику в виде хранимых процедур, при этом их можно максимально оптимизировать, что нельзя сказать о генерируемых запросах фреймворками. А нагромождение не пугает если код хорошо форматирован.
Поправьте текст «Это го можно избежать»
спасибо исправил
Скорее всего это уже не актуально в статье шестилетней давности, но не надо ли проверять done после FETCH, а не внутри WHILE?
Если селект нашёл одну строку, while успешно сработает, фетч получит данные, done не изменится, тело цикла отработает и запустится вторая итерация, while снова сработает, фетч ничего не найдёт, изменит done на 1, но цикл не прервётся и переменные со значениями прошлой итерации попадут ниже в логику тела цикла повторно.
на вас смотрят свысока из 2016 года.
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.