Использование объектных типов в PL/SQL

Статьи -> СУБД -> Oracle

Использование объектных типов в PL/SQL

Статья написана на основе официальной документации фирмы Oracle.
Oracle® Database PL/SQL User's Guide and Reference
10g Release 2 (10.2)
Part Number B14261-01

v:1.0 2008.02.09

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

Объявление и инициализация объектов в PL/SQL

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

В настоящий момент Вы не можете описать типы в PL/SQL блоке, подпрограмме или пакедже. Типы можно описать интерактивно в SQL*Plus, используя SQL выражение CREATE TYPE.

Информацию о выражениях CREATE TYPE и CREATE TYPE BODY можно найти в "Oracle Database SQL Reference".

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

В следующем примере демонстрируется создание объектного типа, тела объекта и таблицы объектных типов

Пример 12-1 Работа с объектными типами.

Объявление объектов в PL/SQL блоке

Вы можете использовать объектные типы точно так же как и встроенные типы такие как CHAR или NUMBER. В примере 12-2, объявляется объект emp типа employee_typ. Для инициализации объекта вызывается конструктор типа employee_typ.

Пример 12-2 Объявление объектного типа в PL/SQL блоке


Вы можете объявлять объекты как формальные параметры функций и процедур. Таким образом, Вы можете передавать объект из одной подпрограммы в другую. В следующем примере объектный тип employee_typ является типом данных формального параметра.


В следующем примере объектный тип employee_typ является типом данных возвращаемого функцией значения:

Как обращаться с неинициализированными объектами в PL/SQL

Пока вы ни инициализируете объект, вызвав конструктор соответствующего типа, объект будет null. Объект сам равен Null, но не его атрибуты.

Неинициализированный объект никогда не равен другому объекту. Фактически, сравнение NULL с любым другим объектом всегда вернет NULL. Если вы присваиваете объект NULL другому объекту, то тот объект становится неинициализированным. Выражения и атрибуты неинициализированного объекта равны NULL. Если к неинициализированному объекту или его атрибутам применить выражение сравнения IS NULL, то результат будет TRUE.

Пример 12-3, иллюстрация объектов null и объектов с аргументами null.

Вывод сообщений: emp is NULL #1 emp.employee_id is NULL #1 emp is NULL #2 emp.employee_id is NULL #3
Вызов методов неинициализированного объекта вызывает предопределенное исключение NULL_SELF_DISPATCH. Если атрибуты неинициализированного объекта передаются как параметры in, то они считаются равными null. Если такие атрибуты передаются как параметры OUT или IN OUT, то генерируется исключение при попытке присвоить им значение.

Манипулирование объектами в PL/SQL

В этом разделе рассказывается как манипулировать методами и атрибутами объектов в PL/SQL.

Доступ к атрибутам объекта в "точечной" нотации

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

Пример 12-4 Доступ к атрибутам объекта

Вызов конструкторов и методов объекта

Вызовы конструкторов осуществляются так же как и вызовы функций. Как и все функции, конструктор вызывается как часть выражения, как показано в примерах 12-4 и 12-5.

Пример 12-5 Вставка рядов в объектную таблицу


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

Подобно подпрограммам пакеджей, методы вызываются используя "точечную" нотацию. В примере 12-6, метод display_address вызывается, чтобы показать атрибуты объекта. Обратите внимание на использование функции VALUE, которая возвращает значение объекта. VALUE принимает аргумент для корреляции переменных. В этом контексте корреляция переменных это переменная ряда или псевдоним таблицы с рядом объектной таблицы.

Пример 12-6 Доступ к методам объекта

Для статических методов, используйте вызов типа type_name.method_name вместо вызова, специфического для экземпляра типа.

При вызове метода экземпляра подтипа фактически вызываемый метод зависит от объявлений в иерархии типов. Если подтип переопределяет метод, который наследуется от супертипа, то фактически выполняется метод подтипа. Если подтип не переопределяет метод, то вызывается метод супертипа. Эта возможность известна как динамическая диспетчеризация метода.
Примечание:
Если Вы реализуете методы на PL/SQL, Вы не можете вызывать метод базового объекта и супертипа с ключевым словом super или эквивалентный метод в наследуемом объекте.

Изменение и удаление объектов

Из PL/SQL блока вы можете модифицировать и удалять ряды в объектной таблице.

Пример 12-7 Изменение и удаление рядов в объектной таблице

Манипуляции объектами через Ref модификаторы

Вы можете использовать ссылки, используя функцию REF, аргументом которой является связанная переменная.

Пример 12-8 Изменение рядов о объектной таблице, используя REF модификатор.

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

Вы не можете использовать ссылки в PL/SQL. Например, присвоение в примере 12-9 с использованием ссылки не допустимо. Вместо ссылки используйте функцию DEREF или обратитесь к объекту через пакедж UTL_REF. Информацию о функции REF смотрите в "Oracle Database SQL Reference".

Пример 12-9 Использование DEREF в выражении SELECT INTO

Информацию о функции DEREF смотрите в "Oracle Database SQL Reference".

Объявления SQL типов, эквивалентных коллекциям типов PL/SQL

Для хранения вложенных таблиц и массивов внутри таблицы базы данных, Вы дополнительно должны определить SQL типы, используя выражение CREATE TYPE. Типы SQL могут быть использованы как колонки или как атрибуты объектного типа SQL. Подробно выражение CREATE TYPE описано в "Oracle Database SQL Reference", о выражении CREATE TYPE BODY смотрите в " Oracle Database SQL Reference", сведенья об объектных типах смотрите в "Oracle Database Application Developer's Guide - Object-Relational Features".

Вы можете объявить эквивалентные типы внутри PL/SQL или использовать типы SQL, объявляя переменные PL/SQL.

Пример 12-10 иллюстрирует как можно объявить вложенную таблицу в SQL и использовать ее как атрибут объектного типа.

Пример 12-10 Объявление вложенной таблицы в SQL

Идентификатор "courses" представляет всю вложенную таблицу. Каждый элемент courses хранит название курса обучения, например 'Math 1020'.

Пример 12-11 создает колонку, которая хранит массивы типа varchar2. Каждый элемент массива xранит значение типа VARCHAR2.

Пример 12-11 Создание таблицы с колонкой типа "массив строк".

В примере 12-12 в таблицу dept_projects вставляется ряд. Конструктор массива строк ProjectList() передает инициализационные значения.

Пример 12-12 Использование конструктора массив строк в выражении SQL.

Пример 12-13, вставка нескольких скалярных величин и вложенной таблицы CourseList в таблицу sophomores.

Пример 12-13 Конструктор вложенной таблицы в SQL выражении

Манипулирование отдельными элементами коллекции в SQL

По умолчанию, SQL операторы хранят и работают с всей коллекцией целиком, но не с отдельными элементами. Для обращения к отдельному элементу коллекции в SQL применяется оператор TABLE. Оператор Table использует подзапросы для извлечения элемента массива или вложенной таблицы, таким образом операторы INSERT, UPDATE или DELETE применяются к отдельным элементам, а не к таблице верхнего уровня.

Чтобы в PL/SQL выполнить операции DML для обработки вложенной таблицы, используйте операторы TABLE и CAST. Таким образом, вы можете выполнить набор операций над вложенной таблицей используя нотацию SQL, без фактического сохранения этой таблицы в базе данных.

Операнд CAST - это фактически коллекция PL/SQL или тип коллекции SQL (созданной выражением CREATE TYPE). CAST преобразует коллекцию PL/SQL в SQL тип. Операторы TABLE и CAST "разворачивают" коллекции в таблицы, чтобы можно было выполнить стандартные манипуляции, используя операторы SQL.

Пример 12-14 выполнение операций над вложенной таблицей в PL/SQL, используя оператор CAST

Использование коллекций PL/SQL с объектными типами SQL

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

В SQL*Plus Вы можете создать объектные типы, чьи объявления соответствуют вложенным таблицам или массивам строк PL/SQL, как показано в примере 12-15. Каждый элемент колонки dept_names - это вложенная таблица, которая хранит имена отделений в соответствующем регионе. Операнд NESTED TABLE необходим, если таблица базы данных должна содержать вложенную таблицу. NESTED TABLE определяет вложенную таблицу и имена для генерируемых системой таблиц, в которых Oracle хранит данные вложенной таблицы.

В PL/SQL Вы можете работать с вложенной таблицей, организуя цикл по ее элементам, используя такие методы как TRIM или EXTEND, изменяя все или некоторые элементы. После чего, измененная таблица может быть снова сохранена в базе данных. Вы можете вставлять ряды, содержащие вложенные таблицы, изменять или заменять вложенные таблицы, вычитывать вложенные таблицы в переменные PL/SQL. Однако непосредственно через SQL невозможно изменение или удаление отдельных элементов вложенных таблиц. Для этого Вам необходимо зачитать вложенную таблицу, изменить ее в PL/SQL и после этого сохранить.

Пример 12-15 Применение к вложенным таблицам выражений INSERT, UPDATE, DELETE, и SELECT

Пример 12-16 показывает как Вы можете манипулировать с объектным типом SQL varray (массив строк), используя выражения PL/SQL. В этом примере, varrays передается между переменными PL/SQL и таблицами SQL. Вы можете встать в таблицу ряд, содержащий varrays, изменить ряд или заменить его varray, после чего зачитать массив в переменные PL/SQL. Непосредственно из SQL вы мене можете изменять или удалять отдельные элементы массива, для этого надо зачитать массив, изменить его требуемым образом и сохранить в базе данных.

Пример 12-16 Использование выражений INSERT, UPDATE, DELETE, и SELECT для работы с массивами.



В примере 12-17, PL/SQL BULK COLLECT используется с многоуровневой коллекцией, которая содержит объектный тип.

Использование динамического SQL с объектами

Пример 12-18 иллюстрирует использование объектов и коллекций с динамическим SQL. Во первых, определяется объектный тип person_typ и массив строк (VARRAY) hobbies_var, а потом - пакедж, в котором будут использоваться эти типы.

Пример 12-18 Пакедж TEAMS, в котором динамический SQL применяется для манипуляции с объектами и коллекциями.


Из анонимного блока, Вы можете вызвать процедуры пакеджа TEAMS:

Пример 12-19 Вызов процедур пакеджа TEAMS

Петрелевич Сергей
petrelevich@yandex.ru

Метки: Oracle   PL/SQL   СУБД  

Комментарии.

Внимание.
Комментировать могут только зарегистрированные пользователи.
Возможно использование следующих HTML тегов: <a>, <b>, <i>, <br>.

Яндекс цитирования Ðåéòèíã@Mail.ru Rambler's Top100