9
правок
Изменения
Курсоры
,Добавлены пояснения к примеру применения курсора
[[<font color = black>no</font>] <font color = black>scroll</font>]</font><font color = green> -- возможность ходить произвольным образом по данным вперед и назад (default - no scroll) </font>
cursor select<font color = gray>...</font><font color = green> -- запрос данных, по которым будет ходить курсор</font>
<font color = red>[</font> for <font color = red>{</font>read <font color = black>only</font><font color = gray>|</font>update <font color = red>[</font>of <font color = red>столбцы]}]</font></font><font color = gray>;</font> <font color = green> -- права на чтение(дефолтное право) или на обновление (всей таблицы или выбранных столбцов)</font>
=== Чувствительность курсора ===
=== Отсутствие данных ===
Если данные закончились, либо при помощи команд был осуществлен невалидный переход, то случится событие '''not found'''.
=== Пример ===
<font color = blue>update <font color = red>таблица</font> set <font color = red>что</font> where current of <font color = red>курсор</font><font color = gray>;</font></font>
<font color = blue>delete from <font color = red>таблица</font> where current of <font color = red>курсор</font><font color = gray>;</font></font>
===Пример применения курсора===
<font color = blue>if <font color = black>FirstName</font> <font color = gray>=</font> <font color = green>'Иван'</font> then
delete from <font color = black>Students</font> where current of <font color = black>SCursor</font><font color = gray>;</font>
end loop<font color = gray>;</font>
end<font color = gray>;</font> </font>
=== Пояснения ===
В данном примере объявлен счетчик <code>cnt</code>, по умолчанию проинициализированный 0, курсор <code>SCursor</code>, перебирающий значение столбца <code>FirstName</code> из таблицы <code>Students</code>. Далее в бесконечном цикле:
# определяем переменную <code>sname</code>, в которой будем хранить имя студента
# достаем следующую запись в эту переменную (напоминание: <code>fetch</code> по умолчанию - это <code>fetch</code> next)
# проверяем, если текущее имя <code>sname</code> имя соответствует выделенному имени <code>name</code>, то увеличиваем счетчик.
Повторяем данные операции до тех пор, пока у нас не случится <code>not found</code>, при возникновении которого в обработчике <code>not found</code> обновим данные статистики, и выйдем из блока, в котором был объявлен <code>handler</code> - то есть в данном случае выйдем из блока процедуры.
===== Примечания =====
Некоторые базы данных позволяют проверить, есть ли в курсоре еще данные. В таких случая пишется цикл <code>while</code> с вызовом метода такой проверки. Но стандартом наличие такой проверки не предусмотрено.
==Особенности курсоров==
===Внешние курсоры===
Результат запроса к базе данных может быть слишком велик и стать виной нехватки памяти как на стороне клиента, так и на стороны сервера, увеличить нагрузку на сеть. Поэтому наружу данные выдаются в виде внешнего курсора. После исполнения команды select выдается внешний курсор на данные, аналогично внешний курсор выдается при возврате результат результата из хранимой процедуры.
===Размер выборки===
Может быть указан для внешнего курсора каким-либо образом (в количестве записей либо или в объеме данных).
При выдаче курсора приходит метаинформация о курсоре и первая порция данных, размер которой мы указали. Для получения последующих порций данных необходимо обращаться к серверу. В конце сервер сообщит о том, что данные закончились, автоматически освободит ресурсы.