Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Выборка PL.SQL.docx
Скачиваний:
4
Добавлен:
20.07.2019
Размер:
316.25 Кб
Скачать
    1. Ссылки на таблицы

Во всех операциях DML производятся ссылки на таблицы. Общий вид ссылки на таблицу можно пред­ставить следующим образом:

[схема. ]таблица[@связьаз_данных]

где схема идентифицирует владельца таблицы, а связь__баз_данных — таблицу удаленной базы данных. Схему указывать не обязательно если вы работаете со своей таблицей.

  1. Курсоры и курсорные переменные

Для обработки SQL-оператора Oracle выделяет область памяти, называемую контекстной областью (context area). Она содержит информацию, необходимую для завершения обработки, в том числе: число строк, обрабатываемых оператором, указатель на представление этого оператора после синтаксического анализа и активный набор (active set), т.е. набор строк, возвращаемых запросом.

Курсор (cursor) — это указатель на контекстную область, с помощью которого программа PL/SQL мо­жет управлять контекстной областью и ее состоянием по время обработки оператора.

Курсоры бывают явные (explicit) (Имя курсора явно при­своено оператору SELECT при помощи оператора CURSOR … IS). Для всех других SQL-операторов применя­ются неявные (implicit) курсоры. Обработка явного курсора выполняется в четыре этапа. Обработка неявного курсора осуществляется в PL/SQL автоматически. Каждый оператор SELECT выполняется в пределах контекстной области и поэтому имеет курсор, указывающий на конкретную контекстную об­ласть. Такой курсор называется SQL-курсором. PL/SQL неявно открывает SQL-курсор, обрабатывает SQL-оператор и впоследствии закрывает этот курсор. Неявные курсоры используются для обработки операторов INSERT, UPDATE, DELETE, а также од­нострочных операторов SELECT..INTO. SQL-курсор открывается и закрывается PL/SQL, поэтому команды OPEN, FETCH и CLOSE не нужны. Однако для SQL-курсоров можно применять курсорные ат­рибуты, например: SQL%ROWCOUNT вернет 1 если последним был оператор UPDATE, который успешно изменил значение таблицы.

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

TYPE имя_типа IS REF CURSOR [RETURN возвращаемый_тип];

где имя_типа — это имя нового ссылочного типа, а возвращаемый__тип — тип записи, указывающий типы списка выбора, которые в итоге будут возвращаться курсорной переменной.

Типом, возвращаемым курсорной переменной, должен быть тип записи. Запись может быть объявлена явно как запись, определяемая пользователем, или неявно, при помощи %ROWTYPE.

Затем можно объявить переменную нового типа. Если RETURN не указано, то переменная не имеет ограничение по типу, возвращаемых запросом записей (неограниченная), иначе ее называют ограниченной. Курсорные переменные используются аналогично курсорам, с тем отличием, что используется имя конкретной переменной в том месте, где д.б. использовано имя курсора.

Для обработки явного курсора в PL/SQL необходимо выполнить четыре шага:

1. Объявить курсор.

При объявлении курсора ему назначается имя и ставится в соответствие некоторый оператор SELECT. Синтаксис объявления курсора таков:

CURSOR имя_курсора IS оператор_SELECT

… [FOR UPDATE [OF имя_столбца]] [NOT WAIT]

где имя_курсора — это имя курсора (идентификатор), a onepamop__SELECTзапрос, который будет обрабатываться. Если указано FOR UPDATE, то курсор блокирует столбцы для изменения в таблице, что дает возможность их менять присваиванием. Столбцы для изменения можно перечислить либо в конструкции OF имя_столбца через запятую, либо после SELECT, как это обычно делается при выборе столбцов. Если указанные столбцы заняты, то при открытии курсор будет ждать бесконечно долго их закрытия, но можно указать NOT WAIT тогда произойдет исключение. Если курсор объявлен с конструкцией FOR UPDATE, в операторе UPDATE или SELECT может быть ука­зана конструкция WHERE CURRENT OF . Синтаксис конструкции WHERE CURRENT OF таков:

WHERE CURRENT OF курсор

где курсор — это имя курсора, объявленного с конструкцией FOR UPDATE. Конструкция WHERE CURRENT OF определяет строку, только что считанную курсором, тем самым предоставляя удобный способ выбора именно той строкой, которая, например, обрабатывается на данном проходе цикла.

Заметьте, что оператор UPDATE обновляет только тот столбец, который указан в конструкции FOR UPDATE при объявлении курсора. Если не указан ни один столбец, можно обновлять любые столбцы.

Разрешается выполнять запрос с конструкцией FOR UPDATE, но при этом не ссылаться на строки, выбранные посредством WHERE CURRENT OF. В этом случае строки остаются блокированными и поэ­тому могут быть модифицированы только текущим сеансом (удерживающим блокировку). Операторы UPDATE и DELETE, изменяющие эти строки, не будут блокировать их, если выполняются сеансом, удерживающим блокировку.

Оператор COMMIT снимает все блокировки, удерживаемые сеансом, и заносит изменения в БД. Когда это происходит, действие курсора FOR UPDATE прекращается и любая последующая попытка считать строки приводит к ошибке. Если требуется применять изменения сразу, то следует использовать обычный курсор (т.к. на обычный курсоры COMMIT не влияет), но вместо WHERE CURRENT OF придется определять нужную строку по каким-либо другим признакам.

Запрос, связанный с курсорной переменной в операторе OPEN..FOR, не может иметь тип FOR UPDATE.

При объявлении курсора можно ссылаться на переменные PL/SQL в условии WHERE, которые рас­сматриваются в качестве переменных присваивания, или привязки. Для курсоров справед­ливы обычные правила по определению области действия, поэтому эти переменные должны быть видимы в точке объявления курсора. Объявление курсора является единственным шагом, который выполняется в разделе объявлении блока; другие три шага являются частью выполняемого раздела или раздела исключительных ситуаций.

Курсор может быть параметризованным (parameterized) т.е. , подобно процедурам, принимать определенные аргументы. Пример:

2. Открыть курсор для запроса.

Синтаксис открытия курсора выглядит следующим образом:

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

Для параметризованного курсора:

OPEN имя_курсора (значения_аргументов_через_запятую);

где имя_курсора обозначает предварительно объявленный курсор. Когда курсор открывается, происходит следующее:

■ Анализируются значения переменных привязки.

■ На основе значений переменных привязки определяется активный набор.

■ Указатель активного набора устанавливается на первую строку.

Можно открыть уже открытый курсор. Перед вторым открытием PL/SQL неявно выполняет опера­тор CLOSE. Кроме того, в любой момент может быть открыто несколько курсоров.

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

OPEN курсорная_переменная FOR оператор_выбора;

где курсорная_переменная — это ранее объявленная курсорная переменная, a оператор_выбора — требуемый запрос. Если курсорная переменная ограничена, список выбора должен соответствовать типу, возвраща­емом)у курсором. Память под курсорную переменную выделяется автоматически.

3. Выбрать результаты в переменные PL/SQL.

Частью оператора FETCH является список INTO. Оператор FETCH имеет две формы:

FETCH имя_курсора INTO список_первменных;

FETCH имя_курсора INTO запись_PL/SQL;

где имя_курсора обозначает предварительно объявленный и открытый курсор, список_переменпих пред­ставляет собой список предварительно объявленных переменных PL/SQL, разделенных запятыми, а запись_PL/ SQLпредварительно объявленная запись PL/SQL. В любом случае переменная (перемен­ные) в конструкции INTO должна иметь тип, совместимый со списком выбора запроса.

Для курсорных переменных аналогично, только вместо имени курсора указывается имя переменной.

4. Закрыть курсор.

Синтаксис закрытия курсора таков: CLOSE имя_курсора; , а закрытия курсорной переменной CLOSE имя_переменной.