Курсор (базы данных)

редактировать

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

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

В процедурах SQL курсор позволяет определять набор результатов (набор строк данных) и выполнять сложную логику построчно. Используя тот же механизм, процедура SQL также может определять набор результатов и возвращать его непосредственно вызывающей стороне процедуры SQL или клиентскому приложению.

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

Содержание
  • 1 Использование
  • 2 Прокручиваемые курсоры
  • 3 "WITH HOLD"
  • 4 Позиционированные операторы обновления / удаления
  • 5 Курсоры в распределенных транзакциях
  • 6 курсоров в XQuery
  • 7 Недостатки курсоров
  • 8 Пример
  • 9 См. Также
  • 10 Ссылки
  • 11 Внешние ссылки
Использование

Чтобы использовать курсоры в процедурах SQL, вам необходимо сделать следующее:

  1. Объявить курсор, который определяет набор результатов.
  2. Откройте курсор, чтобы установить набор результатов.
  3. При необходимости извлеките данные из курсора в локальные переменные, по одной строке за раз.
  4. Закройте курсор, когда закончите.

Для работы с курсорами необходимо использовать следующие операторы SQL

В этом разделе представлены способы, которыми стандарт SQL: 2003 определяет как использовать курсоры в приложениях со встроенным SQL. Не все привязки приложений для систем реляционных баз данных соответствуют этому стандарту, а некоторые (например, CLI или JDBC ) используют другой интерфейс.

Программист сообщает о курсоре СУБД с помощью оператора DECLARE... CURSORи присвоения курсору (обязательно) name:

DECLARE cursor_name CURSOR IS SELECT... FROM...

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

OPEN имя_курсора

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

FETCH имя_курсора INTO...

После того, как приложение обработало все доступные строки или операция выборки должна быть помещена в несуществующую строку (сравните прокручиваемые курсоры ниже), СУБД возвращает SQLSTATE '02000' (обычно сопровождаемый SQLCODE +100), чтобы указать конец набора результатов.

Последний шаг включает закрытие курсора с помощью оператора CLOSE:

CLOSE имя_курсора

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

Прокручиваемые курсоры

Программисты могут объявлять курсоры как прокручиваемые или не прокручиваемые. Возможность прокрутки указывает направление, в котором может перемещаться курсор.

С помощью курсора без прокрутки (или только вперед ) вы можете FETCHкаждую строку не более одного раза, а курсор автоматически переходит к следующей строке. После получения последней строки, если вы выполните выборку снова, вы поместите курсор после последней строки и получите следующий код: SQLSTATE 02000 (SQLCODE +100).

Программа может разместить курсор с возможностью прокрутки в любом месте результирующего набора с помощью оператора SQL FETCH. При объявлении курсора необходимо указать ключевое слово SCROLL. Значение по умолчанию - NO SCROLL, хотя разные языковые привязки, такие как JDBC, могут применять другое значение по умолчанию.

DECLARE cursor_name чувствительность SCROLL КУРСОР ДЛЯ SELECT... FROM...

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

ВЫБРАТЬ [ДАЛЕЕ | ПРИОР | ПЕРВЫЙ | ПОСЛЕДНИЙ] ИЗ имя_курсора
ВЫБРАТЬ АБСОЛЮТНОЕ n ИЗ имя_курсора
ВЫБРАТЬ ОТНОСИТЕЛЬНО n ИЗ имя_курсора;

Прокручиваемые курсоры потенциально могут обращаться к одной и той же строке в наборе результатов несколько раз. Таким образом, модификации данных (операции вставки, обновления, удаления) из других транзакций могут повлиять на набор результатов. Курсор может быть ЧУВСТВИТЕЛЬНЫМ или ЧУВСТВИТЕЛЬНЫМ к таким изменениям данных. Чувствительный курсор улавливает изменения данных, влияющие на результирующий набор курсора, а нечувствительный курсор - нет. Кроме того, курсор может быть INSENSITIVE, и в этом случае СУБД пытается максимально повысить чувствительность.

«WITH HOLD»

Курсоры обычно закрываются автоматически в конце транзакции, т.е. когда происходит COMMIT или ROLLBACK (или неявное завершение транзакции). Это поведение можно изменить, если курсор объявлен с использованием предложения WITH HOLD (по умолчанию - WITHOUT HOLD). Удерживаемый курсор остается открытым при выполнении COMMIT и закрывается при ROLLBACK. (Некоторые СУБД отклоняются от этого стандартного поведения и также оставляют удерживаемые курсоры открытыми при ROLLBACK.)

DECLARE cursor_name CURSOR WITH HOLD FOR SELECT.... FROM....

Когда происходит COMMIT, удерживаемый курсор располагается перед следующей строкой. Таким образом, позиционированный оператор UPDATE или позиционированный оператор DELETE будет успешным только после того, как операция FETCH будет выполнена первой в транзакции.

Обратите внимание, что JDBC определяет курсоры как удерживаемые по умолчанию. Это сделано потому, что JDBC также активирует автоматическую фиксацию по умолчанию.

Позиционированные операторы обновления / удаления

Курсоры могут использоваться не только для извлечения данных из СУБД в приложение, но также для идентификации строки в таблице, которую необходимо обновить или удалить. Стандарт SQL: 2003 определяет для этой цели операторы SQL с позиционированием обновления и удаления с позиционированием. Такие операторы не используют обычное предложение WHERE с предикатами. Вместо этого курсор определяет строку. Курсор должен быть открыт и уже помещен в строку с помощью оператора FETCH.

ОБНОВИТЬ имя_таблицы SET... ГДЕ ТОК имя_курсора
УДАЛИТЬ ИЗ имя_таблицы ГДЕ ТОК имя_курсора

Курсор должен работают с обновляемым набором результатов, чтобы успешно выполнить позиционированный оператор обновления или удаления. В противном случае СУБД не знала бы, как применить изменения данных к базовым таблицам, указанным в курсоре.

Курсоры в распределенных транзакциях

Использование курсоров в распределенных транзакциях (X / Open XA Среды), которые управляются с помощью монитора транзакций, ничем не отличается от курсоров в обычных -распределенные транзакции.

Однако следует соблюдать осторожность при использовании удерживаемых курсоров. Подключения могут использоваться разными приложениями. Таким образом, после завершения и фиксации транзакции последующая транзакция (выполняющаяся в другом приложении) может унаследовать существующие удерживаемые курсоры. Поэтому разработчик приложения должен знать об этой ситуации.

Курсоры в XQuery

Язык XQuery позволяет создавать курсоры с помощью функции subsquence () .

Формат:

let $ display-sequence: = subsquence ($ result, $ start, $ item-count)

Где $ result - результат начальный XQuery, $ start - это номер элемента для запуска, а $ item-count - количество возвращаемых элементов.

Эквивалентно это также можно сделать с помощью предиката:

let $ display-sequence: = $ result [$ start to $ end]

Где $ end- конец последовательность.

Для полных примеров см. XQuery / Searching, Paging and Sorting # Paging в Викиучебнике.

Недостатки курсоров

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

Выборка строки из курсора может каждый раз приводить к сетевому обходу. При этом используется гораздо большая пропускная способность сети, чем обычно требуется для выполнения одного оператора SQL, такого как DELETE. Повторяющиеся обходы сети могут значительно снизить скорость операции с использованием курсора. Некоторые СУБД пытаются уменьшить этот эффект, используя блочную выборку. Блочная выборка подразумевает, что несколько строк отправляются вместе с сервера на клиент. Клиент сохраняет целый блок строк в локальном буфере и извлекает оттуда строки до тех пор, пока этот буфер не будет исчерпан.

Курсоры выделяют ресурсы на сервере, такие как блокировки, пакеты, процессы и временное хранилище. Например, Microsoft SQL Server реализует курсоры, создав временную таблицу и заполняя ее набором результатов запроса. Если курсор неправильно закрыт (освобожден), ресурсы не будут освобождены до закрытия самого сеанса SQL (соединения). Такая трата ресурсов на сервере может привести к снижению производительности и сбоям.

Пример

ТАБЛИЦА СОТРУДНИКОВ

SQL>desc EMPLOYEES_DETAILS; Имя Null? Тип ----------------------------------------- -------- -------------------- EMPLOYEE_ID NOT NULL NUMBER (6) FIRST_NAME VARCHAR2 (20) LAST_NAME NOT NULL VARCHAR2 (25) EMAIL NOT NULL VARCHAR2 (30) PHONE_NUMBER VARCHAR2 (20) HIRE_DATE NOT NULL DATE JOB_ID NOT NULL VARCHAR2 (10) НОМЕР ЗАПЛАТЫ (8,2) НОМЕР COMMISSION_PCT (2,2) НОМЕР MANAGER_ID (6) НОМЕР DEPARTMENT_ID (4)
ОБРАЗЕЦ КУРСОРА, ИЗВЕСТНЫЙ КАК EE CREATE OR REPLACE PROCED НАЧАТЬ ОБЪЯВЛЕНИЕ v_employeeID EMPLOYEES_DETAILS.EMPLOYEE_ID% TYPE; v_FirstName EMPLOYEES_DETAILS.FIRST_NAME% TYPE; v_LASTName EMPLOYEES_DETAILS.LAST_NAME% TYPE; v_JOB_ID EMPLOYEES_DETAILS.JOB_ID% TYPE: = 'IT_PROG'; Курсор c_EMPLOYEES_DETAILS IS SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME FROM EMPLOYEES_DETAILS WHERE JOB_ID = 'v_JOB_ID'; НАЧАТЬ ОТКРЫТЬ c_EMPLOYEES_DETAILS; LOOP FETCH c_EMPLOYEES_DETAILS INTO v_employeeID, v_FirstName, v_LASTName; DBMS_OUTPUT.put_line (v_employeeID); DBMS_OUTPUT.put_line (v_FirstName); DBMS_OUTPUT.put_line (v_LASTName); ВЫЙТИ, КОГДА c_EMPLOYEES_DETAILS% NOTFOUND; КОНЕЦ ПЕТЛИ; ЗАКРЫТЬ c_EMPLOYEES_DETAILS; КОНЕЦ; КОНЕЦ;
См. Также
Ссылки
  • Christopher J. Date : Database in Depth, O'Reilly Associates, ISBN 0-596-10012-4
  • ,: Системы баз данных, Аддисон-Уэсли, ISBN 0-321-21025-5
  • , Шамкант Б. Навате : Основы систем баз данных, Addison-Wesley, ISBN 0-201-54263-3
  • ,: Начало баз данных с PostgreSQL: от новичка к профессионалу, Apress, ISBN 1-59059-478-9
  • : Индивидуальный эксперт: Oracle, Apress, ISBN 1-59059-525 -4
  • Кевин Лони: Oracle Database 10g: The Complete Reference, Oracle Press, ISBN 0-07-225351-7
Внешние ссылки
Последняя правка сделана 2021-05-16 11:48:21
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте