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.