Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Базы данных / БД2012 / Часть 6 КурсорыТриггеры.docx
Скачиваний:
45
Добавлен:
28.03.2015
Размер:
30.57 Кб
Скачать

Курсоры

Для многих людей слово "курсор" ассоциируется с мигающим прямоугольником на экране монитора, предназначенным для указания того места где в файле или приложении находится пользователь. Здесь же под курсором понимается нечто иное. Курсор SQL — это область памяти базы данных, где был сохранен последний из операторов SQL. Если текущим оператором SQL оказывается запрос, в памяти сохраняется также и строка запроса. Эта строка называется текущим значением курсора или текущей строкой. Соответствующая область памяти именуется и оказывается доступной программам.

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

Синтаксисоператора объявления курсора в Oracle следующий.

DECLARE CURSOR ИМЯ_ КУРСОРА

  IS {ОПЕРАТОР_SELECT}

Создаваемый следующим оператором курсор будет содержать все записи таблицы EMPLOYEE_TBL

DECLARE CURSOR EMP_CURSOR IS

SELECT * FROM EMPLOYEE_TBL

{ ДРУГИЕ ОПЕРАТОРЫ ПРОГРАММЫ }

После определения курсора для доступа к нему стандартом ANSI предусмотрены следующие операторы:

OPEN Открывает определенный ранее курсор.

FETCH Извлекаетданные курсора, помещая их в переменную программы.

CLOSE Закрывает курсор после завершения работы с ним.

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

При открытии курсора выполняется указанный в определении этого курсора оператор SELECT, и результат выполнения оператора сохраняется в специальной области памяти.

Синтаксис оператора для открытия курсора в Oracle следующий.

OPEN ИМЯ_КУРСОРА [ ПАРАМЕТР1 [, ПАРАМЕТР2 ]]

Например, следующий оператор открывает курсор EMP_CURSOR: OPEN EMP_CURSOR.

Атрибуты курсора

  •  %ISOPEN — возвращает значение TRUE, если курсор открыт.

  •  %FOUND — определяет, найдена ли строка, удовлетворяющая условию.

  •  %NOTFOUND — возвращает TRUE, если строка не найдена.

  •  %ROWCOUNT — возвращает номер текущей строки.

Доступ к данным курсора

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

Синтаксис оператора в Oracle следующий.

FETCH CURSOR ИМЯ_КУРСОРА {INTO : ГЛАВНАЯ_ПЕРЕМЕННАЯ }

[[ INDICATOR ] : ПЕРЕМЕННАЯ_ИНДИКАТОР ]]

[, : ГЛАВНАЯ_ПЕРЕМЕННАЯ

[[ INDICATOR ] : ПЕРЕМЕННАЯ_ИНДИКАТОР ]]

I USING DESCRIPTOR ДЕСКРИПТОР ]

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

CLOSE ИМЯ_КУРСОРА

Сохраненные процедуры и функции

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

Возможность сохранять процедуры — основа процедурного программирования. Команды SQL (CREATE TABLE, INSERT, UPDATE, SELECT'и т.д.) дают вам возможность сообщить базе данных, что делать, но не как делать. Посредством составления процедур вы получаете возможность сообщить ядру базы данных, каким образом следует обрабатывать данные.

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

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

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

В Oracle синтаксис оператора следующий.

CREATE [ OR REPLACE ] PROCEDURE ИМЯ__ПРОЦЕДУРЫ 

[ (АРГУМЕНТ [(IN | OUT | IN OUT) ] ТИП, 

АРГУМЕНТ [(IN | OUT | IN OUT) ] ТИП] ] (IS | AS)

ТЕЛО_ПРОЦЕДУРЫ

REPLACE Вы должны создавать или замещать процедуру в команде create procedure. Если вы не используете replace, вам необходимо будет сперва удалить процедуру, а затем пересоздать ее. Включая replace, процедура создастся, если ее нет и будет замещена, если таковая уже имеется.

Вот пример оператора, создающего достаточно простую процедуру.

CREATE PROCEDURE NEW_PRODUCT

(PROD_ID IN VARCHAR2, PROD_DESC IN VARCHAR2, COST IN NUMBER) 

AS 

BEGIN

INSERT INTO PRODUCTS_TBL

VALUES (PRODJT.D, PROD_DESC, COST);

COMMIT; 

END;

Процедура создана.

Эту процедуру можно использовать для добавления новых строк в таблицу PRODUCTS_TBL.

В Oracle синтаксис следующий.

EXECUTE [ @ВОЗВРАЩАЕМОЕ_СОСТОЯНИЕ = ] ИМЯ__ПРОЦЕДУРЫ 

[[@ИМЯ_ПАРАМЕТРА = ] ЗНАЧЕНИЕ | [@ШЯ ПАРАМЕТРА = ] @ПЕРЕМЕННАЯ [

 OUTPUT ]] 

[WITH RECOMPILE]

Давайте выполним только что созданную процедуру.

EXECUTE NEW_PRODUCT ('9999','INDIAN CORN',1.99);

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

Преимущества использования процедур

Использовать сохраненные ранее процедуры удобнее, чем отдельные операторы SQL по целому ряду причин. Некоторые из этих причин перечислены ниже.

• Операторы сохраненной процедуры уже сохранены в базе данных. • Операторы сохраненной процедуры уже проверены и находятся в готовом для использования виде • Возможность сохранения процедур позволяет использовать модульное программирование • Сохраненные процедуры могут вызывать другие процедуры и функции. • Сохраненные процедуры могут вызываться другими программами. • При использовании сохраненных процедур результат ответ от базы данных обычно получается быстрее • Использовать процедуры очень просто.

Триггеры

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

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

Оператор CREATE TRIGGER

Триггер можно создать с помощью оператора CREATE TRIGGER. Стандарт ANSI предлагает для этого оператора следующий синтаксис (для справки).

CREATE TRIGGER TRIGGER NAME

[[BEFORE | AFTER] TRIGGER EVENT ON TABLE NAME]

[REFERENCING VALUES ALIAS LIST ]

[TRIGGERED ACTION TRIGGER EVENT ::=

INSERT UPDATE | DELETE {OF TRIGGER COLUMN LIST] 

TRIGGER COLUMN LIST ::= COLUMN NAME [, COLUMN NAME] 

VALUES ALIAS LIST ::= 

VALUES ALIAS LIST ::=

OLD [ROW] [AS] OLD VALUES CORRELATION NAME |

NEW {ROW} {AS} NEW VALUES CORRELATION NAME | 

OLD TABLE {AS} OLD VALUES TABLE ALIAS | 

NEW TABLE {AS} NEW VALUES TABLE ALIAS 

OLD VALUES TABLE ALIAS ::= IDENTIFIER 

NEW VALUES TABLE ALIAS ::= IDENTIFIER 

TRIGGERED ACTION ::=

[FOR EACH [ROW | STATEMENT] [WHEN SEARCH CONDITION]] 

TRIGGERED SQL STATEMENT 

TRIGGERED SQL STATEMENT ::=

SQL STATEMENT | BEGIN ATOMIC [SQL STATEMENT;] 

END

В Oracle базовый синтаксис оператора следующий.

CREATE [ OR REPLACE ] TRIGGER ИМЯ_ТРИГГЕРА

[ BEFORE | AFTER]

[ DELETE I INSERT | UPDATE] 

ON [ ПОЛЬЗОВАТЕЛЬ.ИМЯ_ТАБЛИЦЫ ]

[ FOR EACH ROW ]

[ WHEN УСЛОВИЕ ]

[ БЛОК PL/SQL ]

Вот пример создания триггера.

CREATE TRIGGER EMP_PAY_TRIG 

AFTER UPDATE ON EMPLOYEE_PAY_TBL 

FOR EACH ROW 

BEGIN

INSERT INTO EMPLOYEE_PAY_HISTORY

(EMP_ID, PREV_PAY_RATE, PAY_RATE, DATE_LAST_RAISE, 

TRANSACTION_TYPE)

VALUES

(:NEW.EMP_ID, :OLD.PAY_RATE, :NEW.PAY_RATE,

:NEW.DATE_LAST_RAISE, 'PAY CHANGE');

END; 

В этом примере создается триггер с именем EMP_PAY_TRIG. Этот триггер вставляет строку в таблицу EMPLOYEE_PAY_HISTORY, отражая изменения таблицы EMPLOYEE_PAY_TBL каждый раз, когда данные последней обновляются.

Схемы

О пользователях и схемах

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

Создание учетной записи пользователя в Oracle (зависит от конкретного языка)

Процесс создания учетной записи пользователя в Oracle состоит из двух шагов:

1. Создание учетной записи пользователя базы данных с параметрами по умолчанию 2. Наделение пользователя необходимыми привилегиями доступа

Сокращённыйсинтаксис оператора для создания учетной записи пользователя имеет следующий вид.

CREATE USER ИМЯ_ПОЛЬЗОВАТЕЛЯ

IDENTIFIED BY [ ПАРОЛЬ]

Об операторах управления привилегиями GRANT и REVOKE говорилось ранее.

Соседние файлы в папке БД2012