шпаргалка

Объекты БД Oracle.

[ Назад ]

Объектный тип данных - это тип, определяемый пользователем, и задающий как структуру (атрибуты), так и поведение (методы) объектов.

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



Листинг 6

и, строго говоря, следует пользоваться операторами SQL*PLUS:



Листинг 7

но, конечно же, проблемы такого рода носят чисто технический характер и, несомненно, в следующих версиях будут устранены.

Описание объектных типов

Разделение интерфейса и реализации относится к числу общих мест объектного подхода. Такое разделение, позволяющее выбирать наиболее подходящую реализацию при сохранении интерфейса, проведено, например, в языке программирования ADA, оказавшем заметное влияние на PL/SQL.

Описание объектного типа состоит из двух частей (см. Рис. 4). В интерфейсной декларируются атрибуты объектов и заголовки методов (процедур и функций). В теле типа приводится реализация методов.





Рисунок 4. Две части описания объектного типа данных.

На Листинг 8 приведен пример описания объектного типа Person. В нем используется вспомогательный тип Address, также являющийся объектом (правда, без методов). Идея этого примера заимствована нами из [4].



Листинг 8

По сравнению с традиционными языками программирования объектные средства Oracle8 имеют ряд особенностей. Первая из них состоит в том, что конструкторы объектов определяются неявно, их аргументами являются значения атрибутов. На Листинг 9 приведен пример описания переменной типа Person и создания соответствующего значения. Подчеркнем, что конструкторы Person и Address мы не определяли.

Кроме обращения к конструкторам, на Листинг 9 присутствует вызов метода age (). Видно, что он оформлен в традиционном стиле.



Листинг 9

Вторая особенность объектных средств Oracle8 проистекает из того, что мы имеем дело не с языком программирования, а с СУБД, поэтому объекты, как и значения других типов, нужно индексировать, сравнивать между собой и т.п. Отношение порядка на объектах некоторого типа можно задать двумя способами:

определив функцию, отображающую объекты в упорядоченное множество значений (например, в числа)

определив функцию, сравнивающую два значения-объекта

Чтобы выделить такие "упорядочивающие" функции среди других методов, используются спецификаторы MAP и ORDER, соответственно.

Например, функция age () могла быть описана следующим образом:



Листинг 10

если, конечно, мы согласны сравнивать людей исключительно по возрасту. Попутно отметим, что специфика СУБД сказывается еще и в том, что методам труднее, чем в обычном случае, хранить в объектах информацию о состоянии и извлекать ее. Точнее, в пределах транзакции проблем не возникает, а между транзакциями объект может измениться, и это следует принимать во внимание.

Наконец, третья особенность объектных средств Oracle8, носящая, очевидно, временный характер, состоит в том, что отсутствуют средства наследования, а все атрибуты и методы являются общедоступными. Пока не реализованы спецификаторы EXTENDS, PRIVATE, PROTECTED и т.п., присутствующие в традиционных объектно-ориентированных языках программирования.



2. Основные понятия и конструкции PL/SQL. Курсоры, хранимые процедуры, функции пользователя, триггеры.

PL/SQL - это процедурный блочно-структурированный язык. Он представляет собой расширение языка SQL и предназначен для работы с СУБД Oracle.

PL/SQL предоставляет разработчику приложений и интерактивному пользователю следующие основные возможности:

реализация подпрограмм как отдельных блоков, в том числе использование вложенных блоков;

создание пакетов, процедур и функций, хранимых в базе данных;

предоставление интерфейса для вызова внешних процедур;

поддержка как типов данных SQL, так и типов, вводимых в PL/SQL;

применение явного и неявного курсора, а также оператора цикла FOR для курсора;

введение у переменных PL/SQL и курсоров атрибутов, которые позволяют ссылаться на тип данных или структуру элемента;

введение типов коллекций и объектных типов;

поддержка набора операторов управления и операторов цикла;

реализация механизма обработки исключений.

Основной программной единицей PL/SQL является блок, который может содержать вложенные блоки, называемые иногда подблоками.

Блок позволяет объединять объявления и операторы, связанные общей логикой; может быть анонимным и именованным.

Блок состоит из трех основных частей:

секция объявлений (необязательная часть);

тело блока;

обработчики исключений (необязательная часть).

[ <<label_name>> ]

[DECLARE



]

BEGIN



[EXCEPTION



]

END [label_name]; - Метка блока



- Секция объявлений





- Тело блока



- Обработчики исключений

PL/SQL не чувствителен к регистру, кроме строковых переменных и констант.

Каждая конструкция PL/SQL должна заканчиваться символом ;.

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

PL/SQL является расширением SQL, предлагаемым Oracle. Подобно расширению Transact-SQL, PL/SQL является процедурным языком, структурированным в виде логических блоков программного кода. Блок PL/SQL состоит из трех разделов, два из которых необязательны. Первый раздел представляет собой раздел DECLARE (раздел объявлений) и яшшется необязательным. В разделе DECLARE содержатся переменные, курсоры и константы. Второй раздел — это раздел PROCEDURE (раздел выполняемых операторов), состоящий из условных команд и операторов SQL. Именно в этом разделе осуществляется управление всем блоком, поэтому раздел PROCEDURE является в блоке обязательным. Третий раздел называется разделом EXCEPTION (разделом исключительных состояний), и в нем задается реакция программы на ошибки выполнения и заданные программистом исключительные ситуации. Раздел EXCEPTION в блоке является необязательным. В PL/SQL имеется возможность использования переменных, констант, атрибутов, циклов, обработчиков исключительных ситуаций, отображения сообщений для программиста, управления транзакциями, сохранения процедур, триггеров и пакетов.

Язык PL/SQL поддерживает следующие категории типов:

встроенные типы данных, включая коллекции и записи;

объектные типы данных.

Скалярные типы описывают простые значения, не имеющие внутренних составляющих.

Составные типы описывают структуры, в которых имеются внутренние компоненты.

Ссылочные типы содержат значения. LOB типы содержат значения, называемые локаторами, которые определяют расположение больших объектов хранимых данных (например, графические файлы).

Все встроенные типы данных являются базовыми типами.

Любой базовый тип PL/SQL определяется как набор значений и набор операций, выполнимых над этими значениями.

Язык PL/SQL позволяет определять новые подтипы как подмножество значений некоторого базового типа с тем же набором операций. Подтип не вводит никаких дополнительных операций над данными и не определяет никакого нового типа.

LOB-типы используются для хранения больших объектов (Large Object). Стандарт SQL-99 ввел поддержку LOB-типов для расширенного уровня соответствия. Однако в Oracle реализован более полный набор LOB-типов.

Oracle поддерживает следующие четыре типа для больших объектов:

BFILE - для внешнего двоичного файла;

BLOB - для внутреннего двоичного объекта;

CLOB - для внутреннего символьного объекта;

NCLOB - для внутреннего символьного объекта, учитывающего национальный набор символов.

Любой объект LOB состоит из двух частей: данных и указателя на эти данные, называемого локатором.

Типы BLOB, CLOB или NCLOB могут использоваться как для столбца базы данных, так и для переменной PL/SQL.

Для загрузки объекта LOB предусмотрен пакет PL/SQL DBMS_LOB.

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

Значения переменных различных типов могут присваиваться друг другу в том случае, если они образованы из одного базового типа.

Переменные могут иметь тип данных SQL или тип данных PL/SQL.

Переменная объявляется в секциях объявлений блока PL/SQL, подпрограммы или пакета.

Для объявления переменной после ее идентификатора следует указывать любой доступный тип данных.

Любой оператор языка PL/SQL, используемый для управления ходом выполнения программы, может относиться к одной из следующих групп операторов:

операторы выбора:

IF-THEN-END IF;

IF-THEN-ELSE-END IF;

IF-THEN-ELSIF-END IF;

операторы цикла:

LOOP-END LOOP;

WHILE-LOOP-END LOOP;

FOR-LOOP-END LOOP;

EXIT;

EXIT WHEN;

операторы безусловного перехода:

GOTO;

NULL;

<<labels>>.

Для многих людей слово "курсор" ассоциируется с мигающим прямоугольником на экране монитора, предназначенным для указания того места где в файле или приложении находится пользователь Здесь же под курсором понимается нечто иное Курсор 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

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

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

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

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

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

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

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

Очевидно, если имеется возможность открыть курсор, должна быть предусмотрена и возможность закрыть его. Закрыть курсор несложно, только следует помнить, что после закрытия курсор становится недоступным для программ пользователей.

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

При закрытии курсора в Oracle занимаемые им ресурсы освобождаются автоматически без использования оператора DEALLOCATE. Синтаксис оператора закрытия курсора в Oracle следующий. CLOSE ИМЯ_КУРСОРА

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

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

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

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

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

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

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

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

АРГУМЕНТ [{IN 1 OUT | IN OUT} ] ТИП] ] {IS I AS)

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

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

• Операторы сохраненной процедуры уже сохранены в базе данных.

• Операторы сохраненной процедуры уже проверены и находятся в готовом для использования виде.

• Возможность сохранения процедур позволяет использовать модульное программирование.

• Сохраненные процедуры могут вызывать другие процедуры и функции.

• Сохраненные процедуры могут вызываться другими программами.

• При использовании сохраненных процедур результат ответ от базы данных обычно получается быстрее.

• Использовать процедуры очень просто.

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

Триггер можно создать с помощью оператора CREATE TRIGGER.

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

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

[ BEFORE | AFTER]

[ DELETE I INSERT | UPDATE]

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

[ FOR EACH ROW ]

[ WHEN УСЛОВИЕ ]

[ БЛОК PL/SQL ]

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

Триггер можно удалить с помощью оператора DROP TRIGGER. Синтаксис этого оператора следующий.

DROP TRIGGER ИМЯ_ТРИГТЕPA.



КАТЕГОРИИ:

Network | английский | архитектура эвм | астрономия | аудит | биология | вычислительная математика | география | Гражданское право | демография | дискретная математика | законодательство | история | квантовая физика | компиляторы | КСЕ - Концепция современного естествознания | культурология | линейная алгебра | литература | математическая статистика | математический анализ | Международный стандарт финансовой отчетности МСФО | менеджмент | метрология | механика | немецкий | неорганическая химия | ОБЖ | общая физика | операционные системы | оптимизация в сапр | органическая химия | педагогика | политология | правоведение | прочие дисциплины | психология (методы) | радиоэлектроника | религия | русский | сертификация | сопромат | социология | теория вероятностей | управление в технических системах | физкультура | философия | фотография | французский | школьная математика | экология | экономика | экономика (словарь) | язык Assembler | язык Basic, VB | язык Pascal | язык Си, Си++ |