Как известно, запрос 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. Цикл повторяется, пока не закончатся записи в наборе данных курсора.
предыдущаяследующая