Учебники

PL / SQL — объектно-ориентированный

В этой главе мы обсудим объектно-ориентированный 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, он дает следующий результат —