В этой главе мы обсудим объектно-ориентированный PL / SQL. PL / SQL позволяет определять тип объекта, что помогает в проектировании объектно-ориентированной базы данных в Oracle. Тип объекта позволяет создавать составные типы. Использование объектов позволяет реализовывать объекты реального мира со специфической структурой данных и методами их работы. У объектов есть атрибуты и методы. Атрибуты являются свойствами объекта и используются для хранения состояния объекта; и методы используются для моделирования его поведения.
Объекты создаются с помощью оператора CREATE [OR REPLACE] TYPE. Ниже приведен пример создания простого объекта адреса, состоящего из нескольких атрибутов.
CREATE OR REPLACE TYPE address AS OBJECT (house_no varchar2(10), street varchar2(30), city varchar2(20), state varchar2(10), pincode varchar2(10) ); /
Когда приведенный выше код выполняется в командной строке SQL, он дает следующий результат —
Type created.
Давайте создадим еще одного объекта- клиента, где мы будем связывать атрибуты и методы, чтобы получить объектно-ориентированное чувство —
CREATE OR REPLACE TYPE customer AS OBJECT (code number(5), name varchar2(30), contact_no varchar2(12), addr address, member procedure display ); /
Когда приведенный выше код выполняется в командной строке SQL, он дает следующий результат —
Type created.
Создание объекта
Определение типа объекта обеспечивает план для объекта. Чтобы использовать этот объект, вам нужно создать экземпляры этого объекта. Вы можете получить доступ к атрибутам и методам объекта, используя имя экземпляра и оператор доступа (.) Следующим образом:
DECLARE residence address; BEGIN residence := address('103A', 'M.G.Road', 'Jaipur', 'Rajasthan','201301'); dbms_output.put_line('House No: '|| residence.house_no); dbms_output.put_line('Street: '|| residence.street); dbms_output.put_line('City: '|| residence.city); dbms_output.put_line('State: '|| residence.state); dbms_output.put_line('Pincode: '|| residence.pincode); END; /
Когда приведенный выше код выполняется в командной строке SQL, он дает следующий результат —
House No: 103A Street: M.G.Road City: Jaipur State: Rajasthan Pincode: 201301 PL/SQL procedure successfully completed.
Методы участников
Методы-члены используются для манипулирования атрибутами объекта. Вы предоставляете объявление метода-члена при объявлении типа объекта. Тело объекта определяет код для методов-членов. Тело объекта создается с помощью оператора CREATE TYPE BODY.
Конструкторы — это функции, которые возвращают новый объект в качестве его значения. Каждый объект имеет системный метод конструктора. Имя конструктора совпадает с типом объекта. Например —
residence := address('103A', 'M.G.Road', 'Jaipur', 'Rajasthan','201301');
Методы сравнения используются для сравнения объектов. Есть два способа сравнить объекты —
Метод карты
Метод Map — это функция, реализованная таким образом, что ее значение зависит от значения атрибутов. Например, для объекта customer, если код клиента одинаков для двух клиентов, оба клиента могут быть одинаковыми. Таким образом, отношения между этими двумя объектами будут зависеть от значения кода.
Способ заказа
Метод Order реализует некоторую внутреннюю логику для сравнения двух объектов. Например, для объекта прямоугольника прямоугольник больше, чем другой прямоугольник, если обе его стороны больше.
Используя метод Map
Давайте попробуем понять вышеупомянутые понятия, используя следующий объект прямоугольника —
CREATE OR REPLACE TYPE rectangle AS OBJECT (length number, width number, member function enlarge( inc number) return rectangle, member procedure display, map member function measure return number ); /
Когда приведенный выше код выполняется в командной строке SQL, он дает следующий результат —
Type created.
Создание типа тела —
CREATE OR REPLACE TYPE BODY rectangle AS MEMBER FUNCTION enlarge(inc number) return rectangle IS BEGIN return rectangle(self.length + inc, self.width + inc); END enlarge; MEMBER PROCEDURE display IS BEGIN dbms_output.put_line('Length: '|| length); dbms_output.put_line('Width: '|| width); END display; MAP MEMBER FUNCTION measure return number IS BEGIN return (sqrt(length*length + width*width)); END measure; END; /
Когда приведенный выше код выполняется в командной строке SQL, он дает следующий результат —
Type body created.
Теперь с помощью объекта прямоугольника и его функций-членов —
DECLARE r1 rectangle; r2 rectangle; r3 rectangle; inc_factor number := 5; BEGIN r1 := rectangle(3, 4); r2 := rectangle(5, 7); r3 := r1.enlarge(inc_factor); r3.display; IF (r1 > r2) THEN -- calling measure function r1.display; ELSE r2.display; END IF; END; /
Когда приведенный выше код выполняется в командной строке SQL, он дает следующий результат —
Length: 8 Width: 9 Length: 5 Width: 7 PL/SQL procedure successfully completed.
Используя метод заказа
Теперь того же эффекта можно достичь, используя метод заказа . Давайте воссоздадим объект прямоугольника, используя метод заказа —
CREATE OR REPLACE TYPE rectangle AS OBJECT (length number, width number, member procedure display, order member function measure(r rectangle) return number ); /
Когда приведенный выше код выполняется в командной строке SQL, он дает следующий результат —
Type created.
Создание типа тела —
CREATE OR REPLACE TYPE BODY rectangle AS MEMBER PROCEDURE display IS BEGIN dbms_output.put_line('Length: '|| length); dbms_output.put_line('Width: '|| width); END display; ORDER MEMBER FUNCTION measure(r rectangle) return number IS BEGIN IF(sqrt(self.length*self.length + self.width*self.width)> sqrt(r.length*r.length + r.width*r.width)) then return(1); ELSE return(-1); END IF; END measure; END; /
Когда приведенный выше код выполняется в командной строке SQL, он дает следующий результат —
Type body created.
Использование объекта прямоугольника и его функций-членов —
DECLARE r1 rectangle; r2 rectangle; BEGIN r1 := rectangle(23, 44); r2 := rectangle(15, 17); r1.display; r2.display; IF (r1 > r2) THEN -- calling measure function r1.display; ELSE r2.display; END IF; END; /
Когда приведенный выше код выполняется в командной строке SQL, он дает следующий результат —
Length: 23 Width: 44 Length: 15 Width: 17 Length: 23 Width: 44 PL/SQL procedure successfully completed.
Наследование для объектов PL / SQL
PL / SQL позволяет создавать объекты из существующих базовых объектов. Для реализации наследования базовые объекты должны быть объявлены как НЕ ФИНАЛЬНЫЕ . По умолчанию установлено значение FINAL .
Следующие программы иллюстрируют наследование в объектах PL / SQL. Давайте создадим еще один объект с именем TableTop , он унаследован от объекта Rectangle. Для этого нам нужно создать базовый объект прямоугольника —
CREATE OR REPLACE TYPE rectangle AS OBJECT (length number, width number, member function enlarge( inc number) return rectangle, NOT FINAL member procedure display) NOT FINAL /
Когда приведенный выше код выполняется в командной строке SQL, он дает следующий результат —
Type created.
Создание тела базового типа —
CREATE OR REPLACE TYPE BODY rectangle AS MEMBER FUNCTION enlarge(inc number) return rectangle IS BEGIN return rectangle(self.length + inc, self.width + inc); END enlarge; MEMBER PROCEDURE display IS BEGIN dbms_output.put_line('Length: '|| length); dbms_output.put_line('Width: '|| width); END display; END; /
Когда приведенный выше код выполняется в командной строке SQL, он дает следующий результат —
Type body created.
Создание дочернего объекта столешницы —
CREATE OR REPLACE TYPE tabletop UNDER rectangle ( material varchar2(20), OVERRIDING member procedure display ) /
Когда приведенный выше код выполняется в командной строке SQL, он дает следующий результат —
Type created.
Создание тела типа для таблицы дочернего объекта
CREATE OR REPLACE TYPE BODY tabletop AS OVERRIDING MEMBER PROCEDURE display IS BEGIN dbms_output.put_line('Length: '|| length); dbms_output.put_line('Width: '|| width); dbms_output.put_line('Material: '|| material); END display; /
Когда приведенный выше код выполняется в командной строке SQL, он дает следующий результат —
Type body created.
Использование настольного объекта и его функций-членов —
DECLARE t1 tabletop; t2 tabletop; BEGIN t1:= tabletop(20, 10, 'Wood'); t2 := tabletop(50, 30, 'Steel'); t1.display; t2.display; END; /
Когда приведенный выше код выполняется в командной строке SQL, он дает следующий результат —
Length: 20 Width: 10 Material: Wood Length: 50 Width: 30 Material: Steel PL/SQL procedure successfully completed.
Абстрактные объекты в PL / SQL
Предложение NOT INSTANTIABLE позволяет вам объявлять абстрактный объект. Вы не можете использовать абстрактный объект как есть; вам нужно будет создать подтип или дочерний тип таких объектов, чтобы использовать его функциональные возможности.
Например,
CREATE OR REPLACE TYPE rectangle AS OBJECT (length number, width number, NOT INSTANTIABLE NOT FINAL MEMBER PROCEDURE display) NOT INSTANTIABLE NOT FINAL /
Когда приведенный выше код выполняется в командной строке SQL, он дает следующий результат —