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

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

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

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

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

использование

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

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

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

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

Программист делает курсор известным СУБД используя ЗАЯВИТЬ ... КУРСОР оператор и присвоение курсору (обязательного) имени:

 ЗАЯВИТЬ имя_курсора КУРСОР ВЫБРАН ... ИЗ ...

Прежде чем код сможет получить доступ к данным, он должен открыть курсор с ОТКРЫТО утверждение. Сразу после успешного открытия курсор устанавливается перед первая строка в наборе результатов.

 ОТКРЫТО имя_курсора

Приложения помещают курсоры в определенную строку в наборе результатов с ПРИНЕСТИ утверждение. Операция выборки передает данные строки в приложение.

 ПРИНЕСТИ имя_курсора В ...

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

Последний шаг включает закрытие курсора с помощью ЗАКРЫТЬ утверждение:

 ЗАКРЫТЬ имя_курсора

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

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

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

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

Программа может позиционировать прокручиваемый курсор в любом месте результирующего набора с помощью ПРИНЕСТИ Оператор SQL. При объявлении курсора необходимо указать ключевое слово SCROLL. По умолчанию БЕЗ ПРОКРУТКИ, хотя разные языковые привязки, такие как JDBC, могут применять другое значение по умолчанию.

 ЗАЯВИТЬ имя_курсора чувствительность ПРОКРУТКА КУРСОР ДЛЯ ВЫБРАТЬ ... ИЗ ...

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

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

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

"С УДЕРЖИВАНИЕМ"

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

 ЗАЯВИТЬ имя_курсора КУРСОР С удержанием  ДЛЯ ВЫБРАТЬ .... ИЗ ....

Когда происходит COMMIT, устанавливается удерживаемый курсор. перед следующий ряд. Таким образом, позиционированный ОБНОВИТЬ или позиционируется УДАЛИТЬ Оператор будет успешным только после того, как операция FETCH произошла первой в транзакции.

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

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

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

 ОБНОВИТЬ table_name УСТАНОВИТЬ ... ГДЕ ТОК имя_курсора
 УДАЛИТЬ ИЗ table_name КУДА ТОК имя_курсора

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

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

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

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

Курсоры в XQuery

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

Формат:

позволять $отображаемая последовательность := подпоследовательность($результат, $Начните, $количество предметов)

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

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

позволять $отображаемая последовательность := $результат[$Начните к $конец]

Где $ конец это конечная последовательность.

Полные примеры см. В XQuery / Поиск, пейджинг и сортировка # Пейджинг в Викиучебнике.

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

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

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

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

Пример

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

SQL> desc EMPLOYEES_DETAILS; Имя Null? Тип ----------------------------------------- -------- -------------------- EMPLOYEE_ID НЕ NULL NUMBER (6) FIRST_NAME VARCHAR2 (20) LAST_NAME NOT NULL VARCHAR2 (25) EMAIL NOT NULL VARCHAR2 (30) PHONE_NUMBER VARCHAR2 (20) HIRE_DATE НЕ NULL DATE JOB_ID NOT NULL VARCHAR2 (10) ЗПЛ (8,2) НОМЕР COMMISSION_PCT (2,2) НОМЕР MANAGER_ID (6) НОМЕР DEPARTMENT_ID (4)
ОБРАЗЕЦ КУРСОР ИЗВЕСТЕН В КАЧЕСТВЕ EEСОЗДАЙТЕ ИЛИ ЖЕ ЗАМЕНЯТЬ ПРОЦЕДУРА EE В КАЧЕСТВЕНАЧИНАТЬЗАЯВИТЬ	v_employeeID EMPLOYEES_DETAILS.EMPLOYEE_ID%ТИП;	v_FirstName EMPLOYEES_DETAILS.ИМЯ%ТИП;	v_LASTName EMPLOYEES_DETAILS.ФАМИЛИЯ%ТИП;	v_JOB_ID EMPLOYEES_DETAILS.JOB_ID%ТИП:= "IT_PROG";Курсор c_EMPLOYEES_DETAILS ЯВЛЯЕТСЯ	ВЫБРАТЬ EMPLOYEE_ID, ИМЯ, ФАМИЛИЯ	ИЗ EMPLOYEES_DETAILS	КУДА JOB_ID ="v_JOB_ID";НАЧИНАТЬ	ОТКРЫТО c_EMPLOYEES_DETAILS;	ПЕТЛЯ		ПРИНЕСТИ c_EMPLOYEES_DETAILS В 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%НЕ НАЙДЕН;	КОНЕЦ ПЕТЛЯ;	ЗАКРЫТЬ c_EMPLOYEES_DETAILS;КОНЕЦ;КОНЕЦ;

Смотрите также

Рекомендации

  • Кристофер Дж. Дат: База данных в глубине, O'Reilly & Associates, ISBN  0-596-10012-4
  • Томас М. Коннолли, Кэролайн Э. Бегг: Системы баз данных, Эддисон-Уэсли, ISBN  0-321-21025-5
  • Рамиз Эльмасри, Шамкант Б. Навате: Основы систем баз данных, Эддисон-Уэсли, ISBN  0-201-54263-3
  • Нил Мэтью, Ричард Стоунз: Начало работы с базами данных с PostgreSQL: от новичка до профессионала, Апресс, ISBN  1-59059-478-9
  • Томас Кайт: Один на один с экспертом: Oracle, Апресс, ISBN  1-59059-525-4
  • Кевин Лони: Oracle Database 10g: полный справочник, Oracle Press, ISBN  0-07-225351-7

внешняя ссылка