Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория СУБД Часть 1 Копачев Алексей Геннадьевич, БГУИР (Мет пособие).pdf
Скачиваний:
62
Добавлен:
15.06.2014
Размер:
582.55 Кб
Скачать

34

2) по списку сформированному производится вычисление функции. Если список пустой, то значение функции COUNT есть ???, остальных функций – NULL.

Использование SQL при прикладном программировании.

Язык модулей или встроенный SQL?

В стандарте SQL’89 выделены 2 основных способа взаимодействия программы, написанной на традиционных языках, с базой данных:

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

2)использование так называемого встроенного SQL. В программы на традиционных языках встраивается оператор SQL, при этом он выполняется по месту. Явная параметризация вызовов отсутствует. В основном используется либо глобальная переменная, либо переменная основной программы.

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

В 1-ом случае модуль компилируется отдельно от программы, в результате чего появляется много хранимых процедур.

По 2-му: оператор SQL компилируется в момент обращения к ним при каждом запуске программы.

Язык модулей

<module>::=

<module name clause> <language clause>

<module authorization clause> [declare cursor>…] <procedure>

<module name clause>::= MODULE[<module name>] <language clause>::= LANGUAGE {cobol | fortran | pascal | …}

<module authorization clause>::= AUTHORIZATION <identifier>

Если в модуле – курсоры – они должны были быть описаны. Далее идёт процедура.

Определение процедуры

<procedure>::=

PROCEDURE< procedure name>

35

<parameter declaration> ; <SQL statement>;

<parameter declaration>::=<parameter name><data type> SQLCODE <parameter>::= SQLCODE

<SQL statement>::=< clause > | <commit> | <delete> | <fetch> | <insert> | <open> | <rollback> | <select> | <update>

Delete и update – возможны два варианта : удаление и обновление позиционированное и по условию поиска.

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

Список формальных параметров каждой процедуры состоит из одного: SQLCODE – код ответа.

Встроенный SQL

<embedded SQL statement>::= <SQL prefix>

{<declare cursor> | <embedded exception declaration > |

<SQL statement >}

[<SQL terminator>] <SQL prefix>::=EXEC SQL <SQL terminator>::=END SQL;

<embedded SQL declare section>::= < section>

(<host variable definition>) < section>::=

<SQL prefix> BEGIN DECLARE SECTION [<SQL terminator>] <SQL prefix> END DECLARE SECTION [<SQL terminator>]

<exception declaration >::= WHENEVER <condition>< exception declaration > <condition>::=SQL ERROR | NOT FOUND

< exception declaration >::=CONTINUE | <goto>

Встраиваемые операторы SQL, включая объявления курсоров, должны быть окружены скобками EXEC SQL, END SQL. Объявление курсора должно текстуально встречаться раньше, чем любая ссылка.

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

Набор операторов манипулирования данными

Их условно можно разделить на:

1)операторы связанные с курсором

2)одиночные операторы манипулирующие данными

36

3) операторы завершения транзакций.

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

(1) Операторы связанные с курсором.

1) Оператор объявления курсора

<declare cursor>::= DECLARE <cursor name> CERSOR FOR < cursor specification>

< cursor specification>::=<query expression>[<order by clause >,…] <query expression>::= …как в SELECT

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

Этот оператор не является выполняемым. Он просто связывает имя курсора с его спецификацией.

2)Оператор открытия курсора

OPEN <cursor name>

Обычно требуется, чтобы описание курсора текстуально предшествовало первому оператору OPEN.

Во многих реализациях именно оператор OPEN приводит к непосредственной его компиляции.

Последний оператор

3)Оператор чтения очередной строки курсора.

<fetch statement>::= FETCH <cursor name> INTO <fetch list> <fetch list>::=<target specification> [<target specification>]

В операторе чтения указывается имя курсора и обязательный раздел INTO, куда помещается результат. INTO – это список переменных основной программы для встроенного SQL. Следовательно число типов должно совпадать.

Курсор всегда указывает на какую-то строку, если результат выборки возвращается пустым, то возвращается SQLCODE=100.

4) Оператор позиционного удаления.

<delete statement position>::= DELETE FROM <table name> WHERE CURRENT OF <cursor name>

Если данный курсор открыт, в операторе чтения указывается имя курсора обязательный раздел INTO, куда помещается результат выборки. Это список переменных основной программы (в случае встроенного SQL) или список так называемых “выходных параметров” ( для модульного SQL). Соответственно число, типы должны совпадать. Курсор всегда указывает на какую-то строку. Если таблица пустая, то возвращается SQLCODE=100.

Оператор позиционного удаления.

37

<delete statement: positioned>::= DELETE FROM <table name>

WHERE CURRENT OF <cursor name>

Если данный курсор открыт, то оператор удаляет строку, перед которой установлен курсор, и позиционирует курсор на следующую строку. Таблиц, указанная в этом операторе должна совпадать с таблицей в курсоре.

Оператор позиционной модификации. <update statement: positioned>::=

WPDATE <table name> SET <set clause>

WHERE CURRENT OF <cursor name>

Если некоторый курсор открыт, то происходит изменение значений всех атрибутов в разделе SET данной позиции. При этом после изменения курсора остаётся “висеть” над той же строкой.

Оператор закрытия курсора. CLOSE <cursor name>

Одиночные операторы манипулирования данных.

Выборка оператора:

<select statement>::=

SELECT [ALL|DISTINCT] <select name> INTO <target list> <table expression>

Оператор поискового удаления: <delete statement : positioned>::=

DELETE FROM <table name> WHERE <select condition>

Оператор поискового обновления: <update statement : positioned>::=

UPDATE <table name>

SET <set clause> = <column, column > [WHERE <condition>]

Операторы окончания транзакции: COMMIT WORK ROLLBACK WORK

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