DB2 – система управления реляционными базами данных. Заданное число упорядоченных столбцов и неупорядоченные строки, страница 20

Пока все строки не будут получены


                                                                     Получение строки


                                                                                                Закрытие курсора


Курсоры действуют способом подобным обработке файла.

  • Мы декларируем курсор (определяем имя файла/управляющих блоков).
  • Мы открываем курсор (открываем файл).
  • Мы получаем каждую строку (читаем запись).
  • Мы выполняем это до момента появления условия “строка не найдена”.
  • Мы закрываем курсор (закрываем файл).

Декларирование курсоров

  • Курсоры могут декларироваться для

только для операций чтения

операций обновления

·  Курсор только для чтения в своем предложении SELECT может содержать

предложение DISTINCT

функцию столбца

предложения GROUP BY, HAVING, ORDER BY

коррелированные подзапросы

предложение FROM с более чем одной таблицей

представления (view), доступные только для чтения

Курсоры могут быть одного из двух типов: только для чтения или для обновления тоже.

Курсоры только для чтения используются для чтения данных.

Обновляющий курсор декларируется с использованием предложения FOR UPDATE OF.


Декларировать курсор  -  Формат оператора

  • Общий формат

EXEC SQL

DECLARE <имя курсора> CURSOR FOR

SELECT <столбцы>

FROM <таблица>

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

Например:

EXEC SQL

DECLARE allrows CURSOR FOR

SELECT CRIME_CODE, CRIME

FROM CRIMES;

Allrows – имя декларируемого курсора. Этот курсор выбирает два столбца, CRIME_CODE и CRIME, из таблицы CRIMES.


Декларирование курсоров – Host-переменные

  • Можно использовать host-переменные в предложении WHERE оператора SELECT, например:

EXEC SQL

DECLARE arow CURSOR FOR

SELECT CRIME

FROM CRIMES

WHERE CRIME_CODE = :wanted;

Если требуется, могут использоваться индикаторные переменные.


Использование FETCHдля извлечения множества строк

Множество строк

do

     {

EXEC SQL

                        FETCH allrows

                        INTO :hostvar1, :hostvar2;

                                        …

                   Обработка принятых данных

                                        …

} while (SQLCODE == 0);

    if  (SQLCODE != 100)

         {

                       …   Код ошибки

                        Вывод на экран

                                       …

         }

·  Для курсоров, которые возвращают более одной строки, мы должны разместить FETCH внутри цикла.

·  Мы продолжаем получать данные до тех пор, пока команда FETCH не вернет SQLCODE 100 (строка не найдена).


Закрытие курсоров

  • Когда курсор отработал для всех строк или вы просто завершили работу с курсором, вы можете закрыть его

EXEC SQL

CLOSE arow;

  • Если вы хотите переустановить курсор на первую строку, вы должны закрыть и открыть курсор.  Это действие вернет указатель на первую строку результирующей таблицы.

Когда процесс завершен, мы должны выполнить закрытие курсора. Это освобождает все буферы и рабочие области, выделенные DB2. Чтобы снова начать считывать результирующее множество, необходимо открыть курсор.


Декларирование курсоров для обновления

  • Должны включать при объявлении курсора предложение FORUPDATEOF
  • Должно быть указано, какие столбцы вы хотите обновлять, например:

EXEC SQL

DECLARE updater CURSOR FOR

SELECT CRIME_CODE, CRIME

FROM CRIMES

WHERE CRIME_CODE = :wanted

FOR UPDATE OF CRIME;

  • Имя обновляемого столбца может не входить в список выбираемых столбцов оператора SELECT

Мы можем обновить строку, в позиции которой находится курсор.


Обновление строк используя курсор

  • Используйте SQL оператор UPDATE с добавлением предложения CURRENTOF