PL / SQL - Orientado a Objetos

Neste capítulo, discutiremos a PL / SQL orientada a objetos. A PL / SQL permite definir um tipo de objeto, o que ajuda a projetar um banco de dados orientado a objetos no Oracle. Um tipo de objeto permite criar tipos compostos. O uso de objetos permite que você implemente objetos do mundo real com estrutura específica de dados e métodos para operá-los. Os objetos têm atributos e métodos. Atributos são propriedades de um objeto e são usados ​​para armazenar o estado de um objeto; e métodos são usados ​​para modelar seu comportamento.

Os objetos são criados usando a instrução CREATE [OR REPLACE] TYPE. A seguir está um exemplo para criar um simplesaddress objeto que consiste em alguns atributos -

CREATE OR REPLACE TYPE address AS OBJECT 
(house_no varchar2(10), 
 street varchar2(30), 
 city varchar2(20), 
 state varchar2(10), 
 pincode varchar2(10) 
); 
/

Quando o código acima é executado no prompt SQL, ele produz o seguinte resultado -

Type created.

Vamos criar mais um objeto customer onde vamos embrulhar attributes e methods juntos para ter uma sensação de orientação a objetos -

CREATE OR REPLACE TYPE customer AS OBJECT 
(code number(5), 
 name varchar2(30), 
 contact_no varchar2(12), 
 addr address, 
 member procedure display 
); 
/

Quando o código acima é executado no prompt SQL, ele produz o seguinte resultado -

Type created.

Instanciando um objeto

Definir um tipo de objeto fornece um esquema para o objeto. Para usar este objeto, você precisa criar instâncias deste objeto. Você pode acessar os atributos e métodos do objeto usando o nome da instância ethe access operator (.) como segue -

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; 
/

Quando o código acima é executado no prompt SQL, ele produz o seguinte resultado -

House No: 103A 
Street: M.G.Road 
City: Jaipur 
State: Rajasthan 
Pincode: 201301  

PL/SQL procedure successfully completed.

Métodos de Membros

Member methods são usados ​​para manipular o attributesdo objeto. Você fornece a declaração de um método de membro ao declarar o tipo de objeto. O corpo do objeto define o código para os métodos de membro. O corpo do objeto é criado usando a instrução CREATE TYPE BODY.

Constructorssão funções que retornam um novo objeto como seu valor. Cada objeto tem um método construtor definido pelo sistema. O nome do construtor é igual ao tipo de objeto. Por exemplo -

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

o comparison methodssão usados ​​para comparar objetos. Existem duas maneiras de comparar objetos -

Método de mapa

o Map methodé uma função implementada de forma que seu valor dependa do valor dos atributos. Por exemplo, para um objeto de cliente, se o código do cliente for o mesmo para dois clientes, ambos os clientes podem ser iguais. Portanto, a relação entre esses dois objetos dependeria do valor do código.

Método de pedido

o Order methodimplementa alguma lógica interna para comparar dois objetos. Por exemplo, para um objeto retângulo, um retângulo é maior do que outro retângulo se ambos os lados forem maiores.

Usando o método Map

Vamos tentar entender os conceitos acima usando o seguinte objeto retângulo -

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 
); 
/

Quando o código acima é executado no prompt SQL, ele produz o seguinte resultado -

Type created.

Criando o corpo do tipo -

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; 
/

Quando o código acima é executado no prompt SQL, ele produz o seguinte resultado -

Type body created.

Agora, usando o objeto retângulo e suas funções-membro -

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; 
/

Quando o código acima é executado no prompt SQL, ele produz o seguinte resultado -

Length: 8 
Width: 9 
Length: 5 
Width: 7  

PL/SQL procedure successfully completed.

Usando o método de pedido

Agora o same effect could be achieved using an order method. Vamos recriar o objeto retângulo usando um método de pedido -

CREATE OR REPLACE TYPE rectangle AS OBJECT 
(length number, 
 width number, 
 member procedure display, 
 order member function measure(r rectangle) return number 
); 
/

Quando o código acima é executado no prompt SQL, ele produz o seguinte resultado -

Type created.

Criando o corpo do tipo -

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; 
/

Quando o código acima é executado no prompt SQL, ele produz o seguinte resultado -

Type body created.

Usando o objeto retângulo e suas funções-membro -

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; 
/

Quando o código acima é executado no prompt SQL, ele produz o seguinte resultado -

Length: 23 
Width: 44 
Length: 15 
Width: 17 
Length: 23 
Width: 44 

PL/SQL procedure successfully completed.

Herança para objetos PL / SQL

PL / SQL permite a criação de objetos a partir dos objetos base existentes. Para implementar a herança, os objetos base devem ser declarados comoNOT FINAL. O padrão éFINAL.

Os programas a seguir ilustram a herança em objetos PL / SQL. Vamos criar outro objeto chamadoTableTop, isso é herdado do objeto Rectangle. Para isso, precisamos criar o objeto retângulo base -

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 
/

Quando o código acima é executado no prompt SQL, ele produz o seguinte resultado -

Type created.

Criando o corpo do tipo base -

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; 
/

Quando o código acima é executado no prompt SQL, ele produz o seguinte resultado -

Type body created.

Criando o objeto filho tabletop -

CREATE OR REPLACE TYPE tabletop UNDER rectangle 
(   
   material varchar2(20), 
   OVERRIDING member procedure display 
) 
/

Quando o código acima é executado no prompt SQL, ele produz o seguinte resultado -

Type created.

Criando o corpo do tipo para o objeto filho tabletop

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; 
/

Quando o código acima é executado no prompt SQL, ele produz o seguinte resultado -

Type body created.

Usando o objeto tabletop e suas funções-membro -

DECLARE 
   t1 tabletop; 
   t2 tabletop; 
BEGIN 
   t1:= tabletop(20, 10, 'Wood'); 
   t2 := tabletop(50, 30, 'Steel'); 
   t1.display; 
   t2.display; 
END;
/

Quando o código acima é executado no prompt SQL, ele produz o seguinte resultado -

Length: 20 
Width: 10 
Material: Wood 
Length: 50 
Width: 30 
Material: Steel  

PL/SQL procedure successfully completed.

Objetos abstratos em PL / SQL

o NOT INSTANTIABLEcláusula permite que você declare um objeto abstrato. Você não pode usar um objeto abstrato como ele é; você terá que criar um subtipo ou tipo filho de tais objetos para usar suas funcionalidades.

Por exemplo,

CREATE OR REPLACE TYPE rectangle AS OBJECT 
(length number, 
 width number, 
 NOT INSTANTIABLE NOT FINAL MEMBER PROCEDURE display)  
 NOT INSTANTIABLE NOT FINAL 
/

Quando o código acima é executado no prompt SQL, ele produz o seguinte resultado -

Type created.