Язык программирования баз данных Informix-4GL
5c8b6e8c

Обработка многострочных запросов с использованием аппарата курсоров


Обработка многострочного запроса осуществляется в два этапа. Сначала программа дает старт запросу, после которого не возвращаются никакие данные. Затем программа запрашивает строки данных по одной на каждое требование. Эти операции выполняются с помощью специального объекта данных, называемого курсором. Курсор является структурой данных, представляющей текущее состояние запроса. Основная последовательность программных операций с курсором выглядит следующим образом:

  • Программа объявляет курсор и ассоциированный с ним оператор Select. Это приводит лишь к выделению памяти для хранения курсора.
  • Программа открывает этот курсор, что приводит к началу выполнения ассоциированного оператора Select.
  • Программа считывает очередную строку данных в главные переменные и обрабатывает их.
  • Программа закрывает курсор после прочтения последней строки.
  • Эти операции выполняются с помощью операторов SQL Declare, Open, Fetch, Close, Foreach.

    Множество строк, возвращаемое предложением Select, называется активным множеством. В любой момент времени 4GL-программа может работать только с одной строкой - это текущая строка, на которую указывает курсор. Курсор может находиться в одном из двух состояний: открытом и закрытом. Когда курсор открыт, он связан с открытым множеством и может указывать либо на текущую строку, либо между строк, либо перед первой строкой, либо после последней строки. Если курсор находится в закрытом состоянии, он больше не связан с активным множеством, хотя и остается связанным с оператором Select.

    Объявление курсора

    В процессе использования курсор может задаваться в двух режимах: последовательном и скроллирующим. Последовательный курсор позволяет просматривать активное множество только в последовательном порядке, а также может использоваться при модификации и удалении строк из активного множества. Скроллирующий курсор позволяет просматривать строки из активного множества в произвольном порядке.

    Оператор Declare объявляет курсор, задавая его имя, специфицируя его использование и связывая с курсором оператор Select.


    Оператор Declare не является активным оператором, он только устанавливает свойства курсора и выделяет для него память. Область действия курсора - от точки его объявления до конца файла. Примеры объявления курсора приведены ниже.





    Открытие и закрытие курсора


    Когда программа готова к использованию курсора, она его открывает (активизирует) оператором Open. По оператору Open ассоциированный с курсором оператор Select передается серверу базы данных, который начинает поиск соответствующих строк. Сервер обрабатывает этот запрос до момента нахождения или конструирования первой строки результата. Он реально не возвращает эту строку данных, но устанавливает код возврата в переменную STATUS (sqlca.sqlcode). Если переменная STATUS равен нулю, оператор синтаксически правилен и курсор готов к использованию. Оператор Close, напротив, переводит курсор в закрытое состояние и освобождает активное множество.





    Курсорная выборка строк


    Оператор Fetch служит для выборки строки результата: он именует курсор, переводит курсор к определенной строке активного множества и выбирает значения из этой строки. Оператор Fetch может также задавать имена главных переменных для приема данных в спецификаторе Into, который нужно включать либо в оператор Select, либо в оператор Fetch, но не в оба сразу. Вторая форма имеет то преимущество, что разные строки могут быть считаны в разные переменные. Если оператор Fetch перемещает курсор перед первой строкой или после последней строки, в переменную STATUS (sqlca.sqlcode) устанавливается код возврата NOTFOUND (100).

    Последовательность выбора строк из активного множества определяется типом курсора. Последовательный курсор, будучи открыт один раз, читает строки из активного множества строго последовательно. Единственным значением спецификатора перемещения курсора, используемым по умолчанию, является next.



    При необходимости выполнить группу действий для каждой строки результата (режим Row-by-Row) можно воспользоваться оператором FOREACH ... END FOREACH.


    При его использовании отпадает необходимость в ручном открытии и закрытии курсора.



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

    Next Выбор следующей строки активного множества.
    Previous Выбор предыдущей строки активного множества.
    First Выбор первой строки активного множества.
    Last Выбор последней строки активного множества.
    Current Выбор текущей строки активного множества (той, что была прочитана ранее).
    Relative Выбор n-й строки относительно текущей позиции курсора из активного множества.
    Absolute Выбор n-й строки активного множества (нумерация с 1).
    Ниже приведены примеры записи оператора Fetch c различными значениями спецификатора перемещения курсора.



    Приведенный ниже пример иллюстрирует использование скроллирующего курсора при выборе каждой второй строки из некоторой группы.



    Ниже приведен фрагмент программы для поиска и отображения строк таблицы.






    Содержание раздела