- •1.Традиционные файловые системы
- •1.1.Подход, используемый в файловых системах
- •2.Системы с базами данных
- •2.1.База данных
- •2.2.Система управления базами данных ─ субд
- •2.3.Разработка базы данных смена парадигмы
- •3.Преимущества и недостатки субд
- •4.Модели данных
- •4.1.Объектные модели данных
- •4.2.Модели данных на основе записей
- •4.2.1 Иерархическая модель данных
- •4.2.2 Сетевая модель данных
- •4.2.3 Реляционная модель данных
- •4.2.4 Свойства отношений
- •4.2.5 Реляционная целостность
- •Целостность сущностей
- •Ссылочная целостность
- •Корпоративные ограничения целостности.
- •5.Функции субд
- •6.Компоненты субд
- •7.Системные каталоги
- •8.Инструкции sql
- •8.1.Имена
- •8.2.Имена таблиц
- •8.3.Имена столбцов
- •8.4.Типы данных
- •8.5.Константы
- •9.Инструкция select
- •9.1.Предложение select
- •9.2.Предложение from
- •9.3.Результаты запроса на выборку
- •9.4.Простые запросы
- •9.5.Вычисляемые столбцы
- •9.6.Выборка всех столбцов
- •9.7.Повторяющиеся строки
- •9.8.Отбор строк (предложение where)
- •9.8.1 Сравнение
- •9.8.2 Проверка на принадлежность значений (оператор between and)
- •9.8.3 Проверка на членство в множестве (оператор in)
- •9.8.4 Проверка на соответствие шаблону (оператор like)
- •10.Запросы с объединением таблиц
- •10.1.Производительность при обработке многотабличных запросов
- •11.Статистические (агрегатные) функции
- •12.Запросы с группировкой (предложение group by)
- •12.1.Условие отбора групп (предложение having)
- •13.Подчиненные запросы (подзапросы)
- •13.1.Условия отбора в подчиненном запросе
- •13.1.1 Проверка на существование (предикат exists)
- •13.1.2 Многократное сравнение (предикаты any и all)
- •Предикат any
- •Предикат all
- •13.1.3 Уровни вложенности запросов
- •14.Представления
- •14.1.Создание представлений
- •14.2.Как субд работает с представлениями
- •14.3.Преимущества представлений
- •14.4.Недостатки представлений
- •14.5.Обновление представлений
- •14.6.Контроль над обновлением представлений (предложение with check option)
- •15.Добавление новых данных
- •15.1.Однострочная инструкция insert
- •15.2.Добавление значений null
- •15.3.Добавление всех столбцов
- •15.4.Многострочная инструкция insert
- •16.Удаление существующих данных
- •16.1.Удаление всех строк
- •16.2.Инструкция delete с подчиненным запросом
- •17.Обновление существующих данных
- •17.1.Обновление всех строк
- •17.2.Инструкции update с подчиненным запросом
- •18.Условия целостности данных
- •18.1.Обязательное наличие данных
- •18.2.Условия на значения
- •18.3.Целостность таблиц (сущностей)
- •18.4.Проблемы, связанные со ссылочной целостностью
- •18.5.Правила удаления и обновления
- •18.6.Каскадные удаления
- •18.7.Ссылочные циклы
- •19.Язык определения данных
- •19.1.Создание базы данных
- •19.2.Создание таблиц (инструкция create table)
- •19.2.1 Определения столбцов
- •19.2.2 Определение первичного и внешнего ключей
- •19.2.3 Условия уникальности и ограничения на значения столбцов
- •19.3.Удаление таблицы (инструкция drop table)
- •19.4.Изменение определения таблицы (инструкция alter table)
- •19.4.1 Добавление и удаление столбца
- •19.4.2 Изменение первичных и внешних ключей
- •20.Псевдонимы таблиц (инструкции create / drop synonym)
- •21.Индексы (инструкции create/drop index)
- •22.Транзакции
- •22.1.Инструкции commit и rollback
- •22.2.Модель транзакции в стандарте ansi/iso
- •22.3.Журнал транзакций
- •22.4.Транзакции и работа в многопользовательском режиме
- •22.4.1 Проблема пропавшего обновления
- •22.4.2 Проблема промежуточных данных
- •22.4.3 Проблема несогласованных данных
- •22.4.4 Проблема строк – призраков
- •22.5.Параллельные транзакции
- •22.6.Блокировка
- •22.6.1 Уровни блокировки
- •22.6.2 Жесткая и нежесткая блокировки
- •22.6.3 Тупиковые ситуации
- •22.6.4 Явная блокировка
- •23.Принципы защиты данных, применяемые в sql
- •23.1.Пользователи
- •23.1.1 Аутентификация пользователей
- •23.2.Защищаемые объекты
- •23.3.Привилегии
- •23.3.1 Работа с привилегиями при помощи ролей
- •23.3.2 Роли, определяемые пользователями
- •23.3.3 Разрешение и запрещение ролей
- •23.3.4 Предоставление привилегий (инструкция grant)
- •23.3.5 Передача привилегий (предложение with grant option)
- •23.3.6 Отмена привилегий (инструкция revoke)
- •Инструкция revoke и право предоставления привилегий
- •24.Программирование сервера баз данныхoracle посредством pl/sql
- •24.1.Блоки
- •24.2.Комментарии
- •24.3.Объявления
- •24.3.1 Переменные и константы
- •24.3.2 Подтипы, определяемые пользователями
- •24.3.3 Составные типы, определяемые пользователями
- •Вложенные таблицы
- •Изменяемые массивы
- •24.3.4 Атрибуты
- •24.3.5 Особые замечания относительно вложенных таблиц и изменяемых массивов
- •Инициализация вложенных таблиц и изменяемых массивов
- •Использование методов сборных конструкций со вложенными таблицами и с изменяемыми массивами
- •24.3.6 Курсоры, курсорные типы и курсорные переменные
- •Курсорные типы и переменные
- •24.4.Функциональные возможности программ
- •24.4.1 Управление выполнением программ
- •Условное управление
- •Итерационное управление
- •24.4.2 Взаимодействие с базами данных
- •Стандартный dml
- •Работа с курсорами
- •Работа с курсорными переменными
- •24.4.3 Обработка исключительных ситуаций
- •24.5.Типы программ pl/sql
- •24.5.1 Анонимные блоки
- •24.5.2 Хранимые процедуры и функции
- •Создание процедур
- •Создание функций
- •Вызов процедур и функций
- •Управление блоками в sql*Plus
- •24.5.3 Модули
- •Использование объектов модуля
- •24.5.4 Триггеры баз данных
- •24.6.Служебные модули oracle
- •24.6.1 Модуль dbms_output
- •24.6.2 Динамический sql
- •Модуль dbms_sql
- •Использование dbms_sql
- •24.6.3 Файловый ввод/вывод (модуль utl_file)
- •Безопасность
- •Безопасность базы данных
- •Безопасность операционной системы
- •Исключительные ситуации, устанавливаемые в utl_file
- •Открытие и закрытие файлов
- •Файловый вывод
- •Файловый ввод
- •24.6.4 Взаимодействие между соединениями (модуль dbms_pipe)
- •Посылка сообщений
- •Получение сообщений
- •Создание программных каналов и управление ими
- •Программные каналы
- •Общие и частные каналы
- •Привилегии и безопастность
- •Установление протокола связи
- •Форматирование сообщений
- •Адресация данных
- •25.Создание приложений баз данных средствами odbc
- •25.1.Архитектура odbc
- •25.2.Коды возврата
- •25.3.Основной алгоритм программ odbc
- •25.4.Функции инициализации и завершения
- •25.5.Выполнение операторов
- •25.5.1 Функции управления каталогом
- •25.5.2 Непосредственное выполнение
- •25.5.3 Подготавливаемое выполнение
- •Использование параметров при выполнении.
- •25.6.Выборка результатов.
- •25.6.1 Выборка информации о результирующем множестве
- •25.6.2 Базовые функции выборки данных
- •25.7. Подробный алгоритм использования odbc в прикладных программах
Модуль dbms_sql
Алгоритм выполнения операторов с помощью DBMS_SQL состоит из следующих шагов:
Преобразование SQL – оператора в строку символов;
Грамматический разбор строки символов с помощью DBMS_SQL.PARSE;
Привязка всех входных переменных с помощью DBMS_SQL.BIND_VARIABLE;
Если выполняемый оператор это оператор DML или DDL (UPDATE, DELETE, INSERT) – выполнение его с помощью DBMS_SQL.EXECUTE с последующим считыванием выходных переменных привязки с помощью DBMS_SQL.VARIABLE_VALUE (если нужно),
Если оператор является оператором извлечения (SELECT) – описание выходных переменных с помощью DBMS_SQL.DEFINE_COLUMN;
Выполнение запроса на выборку с помощью DBMS_SQL.EXECUTE и выборка результатов при помощи DBMS_SQL.FETCH_ROWS и DBMS_SQL.COLUMN_VALUE.
Рассмотрим в качестве примера процедуру, которая сначала удаляет, а затем повторно создает временную таблицу; описание таблицы передается процедуре как аргумент.
create or replace procedure RecreateTempTable (/* ОПИСАНИЕ ТАБЛИЦЫ ПЕРЕДАЕТСЯ В ПРОЦЕДУРУ С ПОМОЩЬЮ р_Description И ДОЛЖНО БЫТЬ СОДЕРЖИМЫМ ОПЕРАТОРА CREATE TABLE, РАСПОЛОЖЕННЫМ ПОСЛЕ ИМЕНИ ТАБЛИЦЫ. НАПРИМЕР, НИЖЕ ПРИВЕДЕН ПРАВИЛЬНЫЙ ВЫЗОВ ПРОЦЕДУРЫ: RecreateTempTable( ‘(num_col NUMBER, char_col VARCHAR2(2000))’) */
р_Description in varchar2) is
v_Cursor number;
v_CreateString varchar2(100);
v_DropString varchar2(100);
begin
/* ОТКРОЕМ КУРСОР ДЛЯ ОБРАБОТКИ ДАННЫХ.*/
v_Cursor := DBMS_SOL.OPEN_CURSOR;
/* Удалим таблицу. */
v_DropString := ‘DROP TABLE temp table’;
/* ПРОВЕДЕМ ГРАММАТИЧЕСКИЙ РАЗБОР КОМАНДЫ
* ‘DROP TABLE’ И ВЫПОЛНИМ ЕЕ. ПОСКОЛЬКУ ЭТО
* ОПЕРАТОР DDL, ОБЕ ОПЕРАЦИИ ВЫПОЛНЯЮТСЯ
* С ПОМОЩЬЮ DBMS_SQL.PARSE. ЕСЛИ ТАБЛИЦА
* НЕ СУЩЕСТВУЕТ, УСТАНОВИМ ОШИБКУ ORA-942.
*/
begin
-- DBMS SQL.NATIVE – КОНСТАНТА, ОПИСАННАЯ В
-- ЗАГОЛОВКЕ МОДУЛЯ
DBMS SQL.PARSE (v_Cursor, v_DropString, DBMS_SQL.NATIVE);
exception
when others then
if SQLCODE != -942 then
RAISE;
end if;
end;
/* ТЕПЕРЬ СОЗДАДИМ ТАБЛИЦУ. СНАЧАЛА НУЖНО СОЗДАТЬ
* СТРОКУ СИМВОЛОВ CREATE TABLE, А ЗАТЕМ ПРОВЕСТИ
* ГРАММАТИЧЕСКИЙ РАЗБОР И ОБРАБОТАТЬ ЕЕ.
* ПОСКОЛЬКУ ЭТО ОПЕРАТОР DDL, ОБЕ ОПЕРАЦИИ
* ВЫПОЛНЯЮТСЯ ВЫЗОВОМ DBMS_SQL.PARSE.
*/
v CreateString := ‘CREATE TABLE temp table’ || р_Description;
DBMS_SQL.PARSE (v_Cursor, v_CreateString, DBMS_SQL.NATIVE);
/*РАБОТА ЗАКОНЧЕНА, ПОЭТОМУ ЗАКРОЕМ КУРСОР.*/
DBMS_SQL.СLOSE_CURSOR (v_Cursor);
exception
when others then
/* СНАЧАЛА ЗАКРОЕМ КУРСОР, ЗАТЕМ ПЕРЕУСТАНОВИМ
* ОШИБКУ ТАК, ЧТОБЫ ПЕРЕДАТЬ ЕЕ В ВЫЗЫВАЮЩИЙ
* БЛОК. */
DBMS_SQL.CLOSE_CURSOR (v_Cursor);
raise;
end RecreateTempTable;
При анализе рассмотренного примера необходимо обратить внимание на следующее:
• Строка символов, грамматический разбор которой выполняется, может быть константой (здесь v_DropString), а также может создаваться программой динамически, с помощью символьных функций, например с помощью функции конкатенации (здесь v_CreateString).
• Обработка ошибок осуществляется так же, как и в статическом SQL, – ошибки устанавливаются и обрабатываются с помощью исключительных ситуаций. Отличие в том, что теперь во время выполнения блока, могут возвращаться ошибки компиляции (например ORA-942). В статическом РL/SQL такие ошибки обнаруживаются на этапе компиляции, еще до запуска блока на выполнение.
• Пользователю предоставляются большие возможности по управлению курсорами, в частности, определение моментов их открытия и закрытия. Все открытые курсоры должны быть закрыты даже при установлении исключительной ситуации. В данном случае закрытие курсора обеспечивается вызовом DBMS_SQL.CLOSE_CURSOR в обработчике исключительной ситуации.
На рисунке 37 приведена блок-схема, иллюстрирующая порядок, в котором обычно вызывается DBMS_SQL.
Рисунок 37 Блок-схема алгоритма обработки
данных в DBMS_SQL
С помощью DBMS_SQL можно обрабатывать операторы трех видов: операторы DML, DDL и ALTER SESSION, запросы и анонимные блоки PL/SQL, Каждый из видов обрабатывается различными процедурами. Ниже приведено краткое описание этих процедур, а более детальное объяснение каждой из них будет дано далее, в разделе “Использование DBMS_SQL”.
• OPEN_CURSOR. Как и в статическом SQL, в динамическом РL/SQL каждый SQL-оператор выполняется в границах курсора. Кроме того, в динамическом РL/SQL. можно управлять процессом обработки курсора. OPEN_CURSOR возвращает идентификационный номер курсора, используемый для обозначения контекстной области, в которой будет выполняться оператор. Этот номер будет указываться во всех последующих вызовах данного курсора.
• PARSE. Грамматический разбор оператора заключается в посылке его на сервер, где проверяются синтаксис и семантика данного оператора. Если он является запросом, то на этом этапе определяется план его выполнения. Если это оператор DDL, то он также и выполняется.
• BIND_VARIABLE. Привязка переменной к заполнителю аналогична процессу привязки, используемому в PL/SQL для статических SQL-операторов. Заполнитель (placeholder) – это специальный идентификатор в последовательности символов оператора. В процессе привязки устанавливается соответствие между заполнителем и фактической переменной, а модулю DBMS_SQL сообщается о типе и размере переменной. Привязка выполняется для входных переменных в SQL-операторах и для входных и выходных переменных в операторах PL/SQL.
• DEFINE_COLUMN. Описание элемента списка выбора аналогично привязке входной переменной. В данном случае переменными являются результаты запроса. Процедура DEFINE_COLUMN определяет тип и размер переменных PL/SQL, в которые будут записываться данные при считывании информации процедурой FETCH_ROWS. DEFINE_COLUMN используется только для элементов списка выбора (результатов запросов SELECT), а BIND_VARIABLE – для входных или выходных переменных (заполнителей, указанных в операторах).
• EXECUTE. Исполняет операторы, не являющиеся запросами (SELECT), и возвращает число обработанных строк. Для запросов же EXECUTE определяет активный набор (набор строк, удовлетворяющих условию WHERE запроса). После этого данные считываются процедурой FETCH_ROWS. Для любых операторов переменные привязки анализируются во время работы функции EXECUTE.
• FETCH_ROWS. С каждым вызовом процедуры FETCH_ROWS с сервера считывается все больший объем данных. Затем полученная информация преобразуется в типы данных, указанных процедурой DEFINE_COLUMN. EXECUTE_AND_FETCH позволяет объединить операции обработки и считывания данных в одном вызове.
• COLUMN_VALUE. После вызова FETCH_ROWS процедура COLUMN_VALUE возвращает фактическую информацию. В ней используются переменные того типа, который указан процедурой DEFINE_COLUMN. COLUMN_VALUE следует применять только для запросов.
• CLOSE_CURSOR. После окончания обработки данных курсор закрывается. При этом ресурсы, использовавшиеся курсором, освобождаются.
