Oracle Tutorial de tipos de objetos PL/SQL com EXEMPLOS

O que รฉ tipo de objeto em PL/SQL?

A Programaรงรฃo Orientada a Objetos รฉ especialmente adequada para construir componentes reutilizรกveis โ€‹โ€‹e aplicativos complexos. Eles sรฃo organizados em torno de โ€œobjetosโ€ e nรฃo de โ€œaรงรตesโ€, ou seja, os programas sรฃo projetados para trabalhar e interagir com o objeto inteiro e nรฃo com uma aรงรฃo รบnica. Este conceito permite ao programador preencher e manipular os detalhes no nรญvel das entidades do objeto.

A imagem abaixo mostra um exemplo do tipo de objeto em que uma conta bancรกria รฉ considerada uma entidade objeto. Os atributos do objeto incluem coisas que contรชm alguns valores de atributos, por exemplo, em Conta Bancรกria; รฉ o nรบmero da conta, saldo bancรกrio, etc., enquanto os mรฉtodos de objeto descrevem coisas como cรกlculo da taxa de juros, geraรงรฃo de extrato bancรกrio, etc., que requer a conclusรฃo de determinado processo.

Tipos de objetos em PL/SQL

Em PL/SQL, a programaรงรฃo orientada a objetos รฉ baseada em tipos de objetos.

Um tipo de objeto pode representar qualquer entidade do mundo real. Discutiremos mais tipos de objetos neste capรญtulo.

Componentes de tipos de objetos

PL/SQL o tipo de objeto contรฉm principalmente dois componentes.

  1. Atributos
  2. Membros/Mรฉtodos

Atributos

Atributos sรฃo a coluna ou campo em que os dados sรฃo armazenados. Cada atributo serรก mapeado para o tipo de dados que define o tipo de processamento e armazenamento desse atributo. O atributo pode ser de qualquer valor vรกlido Tipo de dados PL/SQLou pode ser de outro tipo de objeto.

Membros/Mรฉtodos

Membros ou Mรฉtodos sรฃo subprogramas definidos no tipo de objeto. Eles nรฃo sรฃo usados โ€‹โ€‹para armazenar quaisquer dados. Eles sรฃo usados โ€‹โ€‹principalmente para definir processos dentro do tipo de objeto. Para exemplos de validaรงรฃo de dados antes de preencher o tipo de objeto. Eles sรฃo declarados na seรงรฃo de tipo de objeto e definidos na seรงรฃo de corpo do tipo de objeto. A seรงรฃo do corpo no tipo de objeto รฉ uma parte opcional. Se nenhum membro estiver presente, um tipo de objeto nรฃo conterรก nenhuma parte do corpo.

Criar objeto em Oracle

Um tipo de objeto nรฃo pode ser criado no nรญvel do subprograma. Eles podem ser criados apenas no nรญvel do esquema. Uma vez definido o tipo de objeto no esquema, o mesmo pode ser utilizado em subprogramas. O tipo de objeto pode ser criado usando 'CREATE TYPE'. O corpo do tipo sรณ pode ser criado apรณs a criaรงรฃo do seu tipo de objeto.

Criar objeto em OracleCriar objeto em Oracle

CREATE TYPE<object_type_name> AS OBJECT
(
<attribute_l><datatype>,
.
.
);
/
CREATE TYPE BODY<object_type_name> AS OBJECT
(
MEMBER[PROCEDURE|FUNCTION]<member_name> 
IS
<declarative section>
BEGIN
<execution part>
END;โ€ญ
.
.	โ€ฌ
);
/

Explicaรงรฃo da sintaxe:

  • A sintaxe acima mostra a criaรงรฃo de 'OBJECT' com atributos e 'OBJECT-BODY' com mรฉtodos.
  • Os mรฉtodos tambรฉm podem estar sobrecarregados no corpo do objeto.

Inicializaรงรฃo de declaraรงรฃo do tipo de objeto

Como outros componentes em PL/SQL, os tipos de objetos tambรฉm precisam ser declarados antes de serem usados โ€‹โ€‹no programa.

Uma vez criado o tipo de objeto, ele pode ser usado na seรงรฃo declarativa do subprograma para declarar uma variรกvel desse tipo de objeto.

Sempre que qualquer variรกvel for declarada no subprograma como tipo de objeto, em tempo de execuรงรฃo uma nova instรขncia do tipo de objeto serรก criada, e esta instรขncia recรฉm-criada poderรก ser referenciada ao nome da variรกvel. Dessa forma, um รบnico tipo de objeto pode armazenar vรกrios valores em diferentes instรขncias.

Inicializaรงรฃo de declaraรงรฃo do tipo de objeto

DECLARE
<variable_name> <object_type_name>;
BEGIN
.
.
END;
/

Explicaรงรฃo da sintaxe:

  • A sintaxe acima mostra a declaraรงรฃo de uma variรกvel como tipo de objeto na seรงรฃo declarativa.

Uma vez que a variรกvel รฉ declarada como um tipo de objeto em um subprograma, ela serรก atomicamente nula, ou seja, todo o objeto serรก nulo. Ele precisa ser inicializado com valores para usรก-los no programa. Eles podem ser inicializados usando construtores.

Construtores sรฃo o mรฉtodo implรญcito de um objeto que pode ser referido com o mesmo nome do tipo de objeto. A sintaxe abaixo mostra a inicializaรงรฃo do tipo de objeto.

Inicializaรงรฃo de declaraรงรฃo do tipo de objeto

DECLARE
<variable_name> <object_type_name>; 
BEGIN
<variable_name>:=<object_type_name>();
END;
/

Explicaรงรฃo da sintaxe:

  • A sintaxe acima mostra a inicializaรงรฃo da instรขncia do tipo de objeto com um valor nulo.
  • Agora, o objeto em si nรฃo รฉ nulo porque foi inicializado, mas os atributos dentro do objeto serรฃo nulos porque nรฃo atribuรญmos nenhum valor a esses atributos.

Construtores

Construtores sรฃo o mรฉtodo implรญcito de um objeto que pode ser referido com o mesmo nome do tipo de objeto. Sempre que o objeto for referido pela primeira vez, este construtor serรก chamado implicitamente.

Tambรฉm podemos inicializar os objetos usando este construtor. O construtor pode ser definido explicitamente definindo o membro no tipo de objeto body com o mesmo nome do tipo de objeto.

Exemplo 1: No exemplo a seguir usaremos o tipo de objeto member para inserir o registro na tabela emp com valores ('RRR', 1005, 20000, 1000) e ('PPP', 1006, 20000, 1001). Assim que os dados forem inseridos, iremos exibi-los usando o tipo de objeto membro. Tambรฉm usaremos o construtor explรญcito para preencher o ID do gerente por padrรฃo com o valor 1001 para o segundo registro.

Vamos executรก-lo nas etapas abaixo.

  • Step1:
  • Criar tipo de objeto
  • Corpo do tipo de objeto
  • Passo 2: Criaรงรฃo de um bloco anรดnimo para chamar o tipo de objeto criado por meio do construtor implรญcito para emp_no 1005.
  • Etapa 3: Criaรงรฃo de um bloco anรดnimo para chamar o tipo de objeto criado por meio do construtor explรญcito para emp_no 1006.

Passo 1) Criar tipo de objeto e corpo do tipo de objeto

Construtores

CREATE TYPE emp_object AS OBJECT(
emp_no NUMBER,
emp_name VARCHAR2(50),
salary NUMBER,
manager NUMBER,
CONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER, p_emp_name VARCHAR2,
p_salary NUMBER) RETURN SELF AS RESULT),
MEMBER PROCEDURE insert_records,
MEMBER PROCEDURE display_records);
/

Construtores

CREATE OR REPLACE TYPE BODY emp_object AS
CONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER,p_emp_name VARCHAR2,
p_salary NUMBER)
RETURN SELF AS RESULT
IS
BEGIN
Dbms_output.put_line(โ€™Constructor fired..');
SELF.emp_no:=p_emp_no;|
SELF.emp_name:=p_emp_name;
SELF.salary:=p_salary;
SELF.managerial:=1001;
RETURN;
END:
MEMBER PROCEDURE insert_records
IS
BEGIN
INSERT INTO emp VALUES(emp_noemp_name,salary,manager);
END
MEMBER PROCEDURE display_records
IS
BEGIN
Dbms_output.put_line('Employee Name:'||emp_name);
Dbms_output.put_line('Employee Number:'||emp_no);
Dbms_output.put_line('Salary':'||salary);
Dbms_output.put_line('Manager:'||manager);
END:
END:
/

Explicaรงรฃo do cรณdigo

  • Linha de cรณdigo 1-9: Criando o tipo de objeto 'emp_object' com 4 atributos e 3 membros. Contรฉm a definiรงรฃo de construtores com apenas 3 parรขmetros. (O construtor implรญcito real conterรก o nรบmero de parรขmetros igual ao nรบmero de atributos presentes no tipo de objeto)
  • Linha de cรณdigo 10: Criando o corpo do tipo.
  • Linha de cรณdigo 11-21: Definindo o construtor explรญcito. Atribuir o valor do parรขmetro aos atributos e atribuir o valor ao atributo 'manager' com o valor padrรฃo '1001'.
  • Linha de cรณdigo 22-26: Definindo o membro 'insert_records' no qual os valores dos atributos sรฃo inseridos na tabela 'emp'.
  • Linha de cรณdigo 27-34: Definindo o membro 'display_records' no qual sรฃo exibidos os valores dos atributos do tipo de objeto.

saรญda

Tipo criado

Digite corpo criado

Passo 2) Criando bloco anรดnimo para chamar o tipo de objeto criado atravรฉs do construtor implรญcito para emp_no 1005

Construtores

DECLARE
guru_emp_det emp_object;
BEGIN
guru_emp_det:=emp_object(1005,โ€™RRR',20000,1000);
guru_emp_det.display_records;
guru_emp_det.insert_records;
COMMIT;
END;

Explicaรงรฃo do cรณdigo

  • Linha de cรณdigo 37-45: Inserindo os registros usando o construtor implรญcito. A chamada ao construtor contรฉm o nรบmero real de valores de atributos.
  • Linha de cรณdigo 38: Declara guru_emp_det como tipo de objeto 'emp_object'.
  • Linha de cรณdigo 41: A instruรงรฃo 'guru_emp_det.display_records' chamada de funรงรฃo membro 'diplay_records' e os valores dos atributos sรฃo exibidos
  • Linha de cรณdigo 42: A instruรงรฃo 'guru_emp_det.insert_records' chama a funรงรฃo membro 'insert_records' e os valores dos atributos sรฃo inseridos na tabela.

saรญda

Nome do funcionรกrio: RRR

Nรบmero do funcionรกrio: 1005

Salรกrio: 20000

Gerente: 1000

Passo 3) Criando bloco anรดnimo para chamar o tipo de objeto criado atravรฉs do construtor explรญcito para emp_no 1006

Construtores

DECLARE
guru_emp_det emp_object;
BEGIN
guru_emp_det:=emp_object(1006,'PPP',20000);
guru_emp_det.display_records;
guru_emp_det.insert_records;
COMMIT;
END;
/

saรญda

Employee Name:PPP 
Employee Number:1006 
Salary:20000 
Manager:1001

Explicaรงรฃo do cรณdigo:

  • Linha de cรณdigo 46-53: Inserindo os registros usando o construtor explรญcito.
  • Linha de cรณdigo 46: Declara guru_emp_det como tipo de objeto 'emp_object'.
  • Linha de cรณdigo 50: A instruรงรฃo 'guru_emp_det.display_records' chamada de funรงรฃo membro 'display_records' e os valores dos atributos sรฃo exibidos
  • Linha de cรณdigo 51: A instruรงรฃo 'guru_emp_det.insert_records' chama a funรงรฃo membro 'insert_records' e os valores dos atributos sรฃo inseridos na tabela.

Heranรงa no tipo de objeto

A propriedade de heranรงa permite que o tipo de subobjeto acesse todos os atributos e membros do tipo de superobjeto ou tipo de objeto pai.

O tipo de subobjeto รฉ chamado de tipo de objeto herdado e o tipo de superobjeto รฉ chamado de tipo de objeto pai. A sintaxe abaixo mostra como criar o tipo de objeto pai e herdado.

Heranรงa no tipo de objeto

CREATE TYPE <object_type_name_parent> AS OBJECT
(
<attribute_l><datatype>,
.
.
)NOT FINAL;
/

Explicaรงรฃo da sintaxe:

  • A sintaxe acima mostra a criaรงรฃo do tipo SUPER.

Heranรงa no tipo de objeto

CREATE TYPE<object_type_name_sub>UNDER<object_type_name_parent>
(
<attribute_l><datatype>,
.
);
/

Explicaรงรฃo da sintaxe:

  • A sintaxe acima mostra a criaรงรฃo do tipo SUB. Ele contรฉm todos os membros e atributos do tipo de objeto pai.

Exemplo1: No exemplo abaixo, usaremos a propriedade de heranรงa para inserir o registro com o ID do gerente como '1002' para o registro seguinte ('RRR', 1007, 20000).

Vamos executar o programa acima nas seguintes etapas

  • Passo 1: Crie o tipo SUPER.
  • Passo 2: Crie o tipo e o corpo do SUB.
  • Passo 3: Criando um bloco anรดnimo para chamar o tipo SUB.

Passo 1) Crie o tipo SUPER ou o tipo Pai.

Heranรงa no tipo de objeto

CREATE TYPE emp_object AS OBJECT(
emp_no NUMBER,
emp_name VARCHAR2(50),
salary NUMBER,
manager NUMBER,
CONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER,p_emp_name VARCHAR2(50),
p_salary NUMBER)RETURN SELF AS RESULT),
MEMBER PROCEDURE insert_records,
MEMBER PROCEDURE display_records)NOT FINAL;
/

Explicaรงรฃo do cรณdigo:

  • Linha de cรณdigo 1-9: Criando o tipo de objeto 'emp_object' com 4 atributos e 3 membros. Contรฉm a definiรงรฃo de construtores com apenas 3 parรขmetros. Foi declarado como 'NรƒO FINAL', portanto รฉ do tipo pai.

Passo 2) Crie o tipo SUB no tipo SUPER.

Heranรงa no tipo de objeto

CREATE OR REPLACE TYPE sub_emp_object 
UNDER emp_object
(default_manager NUMBER,MEMBER PROCEDURE insert_default_mgr);
/


CREATE OR REPLACE TYPE BODY sub_emp_object 
AS
MEMBER PROCEDURE insert_default_mgr 
IS
BEGIN
INSERT INTO emp
VALUES(emp_no,emp_name:salary,manager):
END;
END;
/

Explicaรงรฃo do cรณdigo:

  • Linha de cรณdigo 10-13: Criando o sub_emp_object como tipo herdado com um atributo adicional 'default_manager' e declaraรงรฃo de procedimento de membro.
  • Linha de cรณdigo 14: Criando o corpo para o tipo de objeto herdado.
  • Linha de cรณdigo 16-21: Definindo o procedimento membro que estรก inserindo os registros na tabela โ€œempโ€ com os valores do tipo de objeto 'SUPER', exceto o valor do gerenciador. Para o valor do gerenciador, estรก usando o tipo 'default_manager' do tipo 'SUB'.

Passo 3) Criando bloco anรดnimo para chamar o tipo SUB

Heranรงa no tipo de objeto

DECLARE
guru_emp_det sub_emp_object;
BEGIN
guru_emp_det:= sub_emp_object(1007,'RRR',20000,1000,1002);
guru_emp_det.insert_default_mgr;
COMMIT;
END;
/

Explicaรงรฃo do cรณdigo:

  • Linha de cรณdigo 25: Declarando 'guru_emp_det' como tipo 'sub_emp_object'.
  • Linha de cรณdigo 27: inicializando o objeto com o construtor implรญcito. O construtor possui 5 parรขmetros (4 atributos do tipo PARENT e 2 atributos do tipo SUB). O รบltimo parรขmetro (1002) define o valor do atributo default_manager
  • Linha de cรณdigo 28: Chamando o membro 'insert_default_mgr' para inserir os registros com o id do gerenciador padrรฃo passado no construtor.

Igualdade de objetos PL/SQL

A instรขncia do objeto que pertence aos mesmos objetos pode ser comparada quanto ร  igualdade. Para isso, precisamos ter o mรฉtodo especial no tipo de objeto denominado mรฉtodo 'ORDER'.

Este mรฉtodo 'ORDER' deve ser a funรงรฃo que retorna o tipo numรฉrico. Sรฃo necessรกrios dois parรขmetros como entrada (primeiro parรขmetro: id da instรขncia do objeto prรณprio, segundo parรขmetro: id de outra instรขncia do objeto).

O id das duas instรขncias do objeto รฉ comparado e o resultado รฉ retornado em forma numรฉrica.

  • O valor positivo representa que a instรขncia do objeto SELF รฉ maior que outra instรขncia.
  • O valor negativo representa que a instรขncia do objeto SELF รฉ menor que outra instรขncia.
  • Zero representa que a instรขncia do objeto SELF รฉ igual a outra instรขncia.
  • Se alguma das instรขncias for nula, esta funรงรฃo retornarรก nulo.

Igualdade de objetos PL/SQL

CREATE TYPE BODY<object_type_name_ 1>AS OBJECT
(
  ORDER MEMBER FUNCTION match(<parameter> object_type_name_ 1)
  RETURN INTEGER IS		
  BEGIN
    IF <attribute_name>parameter <attribute_name>THEN
      RETURN -1; --any negative number will do
    ELSIF id>c.id THEN
      RETURN 1; โ€”any positive number will do
    ELSE
      RETURN 0;
    END IF;
  END;
  .
  .
);
/

Explicaรงรฃo da sintaxe:

  • A sintaxe acima mostra a funรงรฃo ORDER que precisa ser incluรญda no corpo do tipo para verificaรงรฃo de igualdade.
  • O parรขmetro para esta funรงรฃo deve ser uma instรขncia do mesmo tipo de objeto.
  • A funรงรฃo acima pode ser chamada como โ€œobj_instance_1.match(obj_instance_2)โ€ e esta expressรฃo retornarรก o valor numรฉrico conforme mostrado, onde obj_instance_1 e obj_instance_2 sรฃo a instรขncia de object_type_name.

Example1: No exemplo a seguir veremos como comparar dois objetos. Vamos criar duas instรขncias e comparar o atributo 'salรกrio' entre elas. Faremos duas etapas.

  • Etapa 1: Criando o tipo e o corpo do objeto.
  • Etapa 2: Criando o bloco anรดnimo para chamar a comparaรงรฃo da instรขncia do objeto.

Passo 1) Criando o tipo e corpo do objeto.

Igualdade de objetos PL/SQL

Igualdade de objetos PL/SQL

CREATE TYPE emp_object_equality AS OBJECT(
salary NUMBER,
ORDER MEMBER FUNCTION equals(c emp_object_equality)RETURN INTEGER);
/
CREATE TYPE BODY emp_object_equality AS
ORDER MEMBER FUNCTION equals(c emp_object_equality)RETURN INTEGER 
IS
BEGINโ€ญ	โ€ฌ
IF salary<c.salary
THEN RETURN -1;
ELSIF salary>c.salary
THEN RETURN 1;
ELSE
RETURN 0;
END IF:โ€ญ	โ€ฌ
END;
END;
/

Explicaรงรฃo do cรณdigo:

  • Linha de cรณdigo 1-4: Criando o tipo de objeto 'emp_object_equality' com 1 atributo e 1 membro.
  • Linha de cรณdigo 6-16: Definindo a funรงรฃo ORDER que compara o atributo 'salรกrio' da instรขncia SELF e o tipo de instรขncia do parรขmetro. Retorna negativo se o salรกrio SELF for menor ou positivo se o salรกrio SELF for maior e 0 se os salรกrios forem iguais.

Saรญda de cรณdigo:

Tipo criado

Passo 2) Criando o bloco anรดnimo para chamar a comparaรงรฃo da instรขncia do objeto.

Igualdade de objetos PL/SQL

DECLARE
l_obj_l emp_object_equality;
l_obj_2 emp_object_equality;
BEGIN
l_obj_l:=emp_object_equality(15000); 
l_obj_2:=emp_object_equality(17000);
IF l_obj_1.equalS(l_obj_2)>0
THEN
Dbms_output.put_line(โ€™Salary of first instance is greaterโ€™):
ELSIF l_obj_l.equalS(l_obj_2)<0
THEN
Dbms_output.put_line(โ€™Salary of second instance is greaterโ€™); 
ELSE
Dbms_output.put_line(โ€™Salaries are equalโ€™);
END IF;
END;
/

saรญda

Salary of second instance is greater

Explicaรงรฃo do cรณdigo:

  • Linha de cรณdigo 20: Declarando o l_obj_1 do tipo emp_object_equality.
  • Linha de cรณdigo 21: Declarando o l_obj_2 do tipo emp_object_equality.
  • Linha de cรณdigo 23: Inicializando l_obj_1 com valor de salรกrio como '15000'
  • Linha de cรณdigo 24: Inicializando l_obj_1 com valor de salรกrio como '17000'
  • Linha de cรณdigo 25-33: imprime a mensagem com base no nรบmero de retorno da funรงรฃo ORDER.

Resumo

Neste capรญtulo, vimos o tipo de objeto e suas propriedades. Tambรฉm discutimos sobre Construtores, Membros, Atributos, Heranรงa e Igualdade em objetos PL/SQL.

Resuma esta postagem com: