- •Работа транзакций в смеси
- •Проблема параллельной работы транзакций
- •Блокировки
- •Разрешение тупиковых ситуаций.
- •Предикатные блокировки
- •Метод временных меток
- •Механизм выделения версий данных
- •Теория Есварана
- •Протокол двухфазной блокировки
- •Реализация изолированности транзакций средствами языка SQL
- •Транзакции и восстановление данных
- •Виды восстановления данных
- •Индивидуальный откат транзакций
- •Восстановление после мягкого сбоя
- •Восстановление после жесткого сбоя
- •Представление знаний в интеллектуальных системах.
- •Данные и знания. Основные определения
- •Модели представления знаний
- •Способы описания.
- •Стратегии решения организации поиска
- •Логический подход. Представление простых фактов в логических системах
- •Типовая организация СУБД. Внутренняя организация реляционной СУБД
- •Внутренняя организация реляционной СУБД.
- •Хэширование
- •Журнальная информация
- •Служебная информация
- •Язык SQL. Функции и основные возможности
- •Определение ограничения целостности и тригеров
- •Представление БД
- •Определение управляющих структур
- •Авторизация доступа к отношениям и их полям
- •Точки сохранения и отката транзакций. Встроенный SQL
- •Динамический SQL
- •Определение представлений.
- •Определение привилегий.
- •Средства манипулирования данными.
- •Табличные выражения.
- •Использование SQL при прикладном программировании.
- •Встроенный SQL
- •Одиночные операторы манипулирования данных.
- •Некоторые черты SQL’92 и SQL–3 (SQL’99)
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
При выполнении любого из этих операторов происходит принудительное закрытие всех курсоров, открытых к моменту завершения транзакции.
