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

В этой главе мы обсудим объектно-ориентированный PL / SQL. PL / SQL позволяет определять тип объекта, что помогает при проектировании объектно-ориентированной базы данных в Oracle. Тип объекта позволяет создавать составные типы. Использование объектов позволяет вам реализовать объекты реального мира с определенной структурой данных и методами работы с ними. У объектов есть атрибуты и методы. Атрибуты - это свойства объекта, которые используются для хранения состояния объекта; и методы используются для моделирования его поведения.

Объекты создаются с помощью оператора CREATE [OR REPLACE] TYPE. Ниже приведен пример создания простогоaddress объект, состоящий из нескольких атрибутов -

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.

Создадим еще один объект customer где мы завернем attributes и methods вместе иметь объектно-ориентированное чувство -

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.

Создание экземпляра объекта

Определение типа объекта дает схему объекта. Чтобы использовать этот объект, вам необходимо создать экземпляры этого объекта. Вы можете получить доступ к атрибутам и методам объекта, используя имя экземпляра иthe access operator (.) следующим образом -

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.

Методы участников

Member methods используются для управления attributesобъекта. Вы предоставляете объявление метода члена при объявлении типа объекта. Тело объекта определяет код для методов-членов. Тело объекта создается с помощью оператора CREATE TYPE BODY.

Constructors- это функции, которые возвращают новый объект в качестве своего значения. Каждый объект имеет метод конструктора, определенный системой. Имя конструктора совпадает с типом объекта. Например -

residence := address('103A', 'M.G.Road', 'Jaipur', 'Rajasthan','201301');

В comparison methodsиспользуются для сравнения объектов. Есть два способа сравнить объекты -

Метод карты

В Map method- это функция, реализованная таким образом, что ее значение зависит от значения атрибутов. Например, для объекта клиента, если код клиента одинаков для двух клиентов, оба клиента могут быть одинаковыми. Таким образом, отношения между этими двумя объектами будут зависеть от значения кода.

Способ заказа

В Order methodреализует некоторую внутреннюю логику для сравнения двух объектов. Например, для прямоугольного объекта прямоугольник больше другого прямоугольника, если обе его стороны больше.

Использование метода карты

Давайте попробуем понять вышеупомянутые концепции, используя следующий прямоугольный объект -

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.

Использование метода заказа

Теперь same effect could be achieved using an order method. Давайте воссоздадим объект прямоугольника с помощью метода заказа -

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 позволяет создавать объект из существующих базовых объектов. Для реализации наследования базовые объекты должны быть объявлены какNOT FINAL. По умолчанию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.

Использование объекта tabletop и его функций-членов -

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, он дает следующий результат:

Type created.