Язык PL/SQL
всегда поддерживал традиционные процедурные стили программирования, в частности структурное проектирование и функциональную декомпозицию. Пакеты PL/SQL
позволяют использовать также объектно-ориентированный подход, применяя в работе с реляционными таблицами принципы абстракции и инкапсуляции. В новых версиях Oracle
введена непосредственная поддержка объектно-ориентированного программирования (ООП). Программистам стали доступны богатая и сложная система типов, иерархия, а также взаимозаменяемость типов.
Хотя тема объектно-ориентированного программирования в Oracle
могла бы стать предметом отдельной книги, мы рассмотрим лишь несколько примеров, демонстрирующих важнейшие аспекты объектно-ориентированного программирования на PL/SQL
:
- создание и использование объектных типов;
- наследование и взаимозаменяемость;
- эволюция типов;
- выборка данных на основе
REF
-ссылок; - объектные представления, в том числе
INSTEAD OF
.
Не рассчитывайте найти в этой статье:
- Полные диаграммы синтаксиса команд
SQL
для работы с объектными типами. - Обсуждение вопросов, относящихся к компетенции администраторов базы данных, — например, импортирования и экспортирования объектных данных.
- Описания низкоуровневых аспектов (структуры хранения данных на диске). Начнем с краткого исторического экскурса.
История объектных возможностей Oracle
Впервые появившиеся в 1997 году как дополнение к Oracle8
, объектные возможности позволили разработчикам расширить набор встроенных типов данных Oracle
абстрактными типами данных. Также в Oracle8
были введены определяемые программистом коллекции, оказавшиеся очень удобными. Объектная модель Oracle
обеспечивает много интересных возможностей, в частности доступ к данным через указатели, но она не поддерживает ни наследования, ни динамического полиморфизма, и поэтому объектно-ориентированные средства Oracle8
вряд ли произведут впечатление на приверженцев настоящего ООП. Сложность и низкая производительность объектных функций также не способствуют их успеху.
В Oracle8i
была введена поддержка хранимых процедур Java
, которые позволяли программировать на менее специализированном языке, чем PL/SQL
, и упростили разработку хранимых процедур для сторонников ООП. Появился способ преобразования объектных типов, определенных на сервере, в Java
-классы, что делало возможным совместную работу с данными в Java
и в базе данных. Версия Oracle8i
вышла в период наивысшего интереса к языку Java
, поэтому мало кто заметил, что объектные функции Oracle
почти не изменились, разве что начали понемногу интегрироваться с базовым сервером. В то время я спросил одного из представителей Oracle
о будущем ООП на языке PL/SQL
, и тот ответил: «Если вам требуется настоящее объектно-ориентированное программирование, пользуйтесь Java
».
Однако в Oracle9i
встроенная поддержка объектов была значительно расширена. Введена поддержка наследования и полиморфизма в базах данных, PL/SQL
был оснащен новыми объектными средствами. Имеет ли смысл расширять объектную модель системы на структуру базы данных? Следует ли переписать существующие приложения клиентского и промежуточного уровней? Как показано в табл. 1, в Oracle
были реализованы значительные достижения в ООП, и переход на эту технологию выглядит очень заманчиво. Также в таблице перечислены полезные возможности, которые еще не реализованы.
Таблица 1. Возможности Oracle
Таблица 1 (продолжение)
В Oracle
Database
10g
было включено несколько полезных улучшений в области коллекций, но только одна новая возможность, относящаяся к объектным типам: она описана во врезке «Псевдостолбец OBJECT_VALUE
» (см. с. 936).
Если вы еще не применяете объектно-ориентированное программирование в своих разработках, многие термины в этой таблице покажутся вам незнакомыми. Однако из оставшейся части этой статьи вы поймете их смысл и получите представление о более масштабных архитектурных решениях, которые вам придется принимать.