Неявный курсор

  • Часть 1
  • | 2

Как известно, запрос SELECTвозвращает таблицу результатов запроса, но приложения не всегда могут эффективно работать с результирующим набором. Возникает проблема доступа к каждой строке этой таблицы, которая может быть решена при использовании неявного курсора.

В процедурном языке Firebird цикл для построчной обработки набора данных неявного курсора организуется с помощью следующей конструкции:

FOR

SELECT [DISTINCT| ALL]

{ <возвращаемый_элемент1> [, <возвращаемый_ элемент2> ] …} FROM базовая_таблица1 [, базовая_таблица2 ] …

[WHERE<условие_поиска>]

[GROUP BY <элемент_группировки1> [, <элемент_группировки2>]… ] [HAVING<условие_поиска>]

[ORDER BY <элемент_сортировки1> [, <элемент_сортировки2>]…] INTO :<имя_переменной1> [, :<имя_переменной2> …] [AS CURSOR имя_курсора] DO<группа_операторов>, где <имя_переменной>:: = {имя_локальной_переменной

| входной_параметр | выходной_параметр}. Как   следует   из   приведенного   синтаксиса,   набор   данных   курсора определяется   запросом   SELECT,   который   может   соединять   данные   из нескольких таблиц, содержать условия поиска, сортировку и т.д.

Для обработки всех строк, возвращаемых запросом SELECT, организуется цикл. При этом в запросе SELECT используется предложение INTO. Оно определяет, что значения возвращаемых элементов должны быть присвоены переменным, определенным в теле ХП, триггера или блока. Предложение INTO в запросе SELECT должно быть последним, если он имеет другие предложения (например, WHERE).

Каждый раз, когда обрабатывается очередная строка в цикле, значения возвращаемых элементов присваиваются переменным, указанным в предложении INTO. При этом <группа_операторов> выполняется один раз для каждой строки, сформированной запросом SELECT. Цикл повторяется, пока не закончатся записи в наборе данных курсора.

предыдущаяследующая