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


















