Tutorial de tipos de objetos Oracle PL / SQL com EXEMPLOS

Índice:

Anonim

O que é tipo de objeto em PL / SQL?

A Programação Orientada a Objetos é especialmente adequada para a construção de componentes reutilizáveis ​​e aplicativos complexos. Eles são organizados em torno de "objetos" em vez de "ações", ou seja, os programas são projetados para trabalhar e interagir com o objeto inteiro em vez de uma única ação. Este conceito permite ao programador preencher e manipular os detalhes no nível de entidades de 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 atributo, 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.

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.

Neste tutorial - você aprenderá,

  • Componentes de tipos de objetos
  • Criar objeto no Oracle
  • Inicialização de declaração de tipo de objeto
  • Construtores
  • Herança no tipo de objeto
  • Igualdade de objetos PL / SQL

Componentes de tipos de objetos

O tipo de objeto PL / SQL contém principalmente dois componentes.

  1. Atributos
  2. Membros / Métodos

Atributos

Atributos são a coluna ou campo no qual os dados são armazenados. Cada atributo será mapeado para o tipo de dados que define o processamento e o tipo de armazenamento desse atributo. O atributo pode ser de qualquer tipo de dados PL / SQL válido ou 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 nenhum dado. 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 de tipo de objeto 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 no 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 que o tipo de objeto é definido no esquema, o mesmo pode ser usado em subprogramas. O tipo de objeto pode ser criado usando 'CREATE TYPE'. O corpo do tipo pode ser criado somente após a criação de seu tipo de objeto.

CREATE TYPE AS OBJECT(,… );/CREATE TYPE BODY AS OBJECT(MEMBER[PROCEDURE|FUNCTION]ISBEGINEND;‭… ‬);/

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 ser sobrecarregados no corpo do objeto.

Inicialização de declaração de tipo de objeto

Como outros componentes em PL / SQL, os tipos de objeto também precisam ser declarados antes de serem usados ​​no programa.

Uma vez que o tipo de objeto é criado, ele pode ser usado na seção declarativa do subprograma para declarar uma variável daquele 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 essa instância recém-criada pode ser referenciada ao nome da variável. Dessa forma, um único tipo de objeto pode armazenar vários valores em diferentes instâncias.

DECLARE ;BEGIN… END;/

Explicação da sintaxe:

  • A sintaxe acima mostra a declaração de uma variável como um tipo de objeto na seção declarativa.

Depois que a variável é declarada como um tipo de objeto em um subprograma, ela será atomicamente nula, ou seja, o próprio objeto inteiro 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 a seguir mostra a inicialização do tipo de objeto.

DECLARE ;BEGIN:=();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 próprio objeto não é nulo porque foi inicializado, mas os atributos dentro do objeto serão nulos, pois 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 esses construtores. O construtor pode ser definido explicitamente definindo o membro no corpo do tipo de objeto com o mesmo nome do tipo de objeto.

Exemplo 1 : No exemplo a seguir, vamos usar o tipo de objeto membro para inserir o registro na tabela emp com valores ('RRR', 1005, 20000, 1000) e ('PPP', 1006, 20000, 1001). Depois que os dados forem inseridos, vamos exibi-los usando o tipo de objeto membro. Também usaremos o construtor explícito para preencher o id do gerenciador por padrão com o valor 1001 para o segundo registro.

Vamos executá-lo nas etapas a seguir.

  • Passo 1:
    • Criar tipo de objeto
    • Corpo do tipo de objeto
  • Passo 2: Criar um bloco anônimo para chamar o tipo de objeto criado por meio do construtor implícito para emp_no 1005.
  • Passo 3: Criar um bloco anônimo para chamar o tipo de objeto criado por meio do construtor explícito para emp_no 1006.

Etapa 1) Criar o tipo de objeto e o 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 ASCONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER,p_emp_name VARCHAR2,p_salary NUMBER)RETURN SELF AS RESULTISBEGINDbms_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_recordsISBEGININSERT INTO emp VALUES(emp_noemp_name,salary,manager);ENDMEMBER PROCEDURE display_recordsISBEGINDbms_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. Ele 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. Atribuindo o valor do parâmetro aos atributos e atribuindo o valor ao atributo 'gerente' 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 exibindo os valores dos atributos de tipo de objeto.

Resultado

Tipo criado

Corpo do tipo criado

Etapa 2) Criação de bloco anônimo para chamar o tipo de objeto criado por meio do construtor implícito para emp_no 1005

DECLAREguru_emp_det emp_object;BEGINguru_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 o guru_emp_det como tipo de objeto de 'emp_object'.
  • Linha de código 41 : Instrução 'guru_emp_det.display_records' chamada de função de membro 'diplay_records' e os valores dos atributos são exibidos
  • Linha de código 42 : Instrução 'guru_emp_det.insert_records' chamada de função de membro 'insert_records' e os valores dos atributos são inseridos na tabela.

Resultado

Nome do funcionário: RRR

Número do funcionário: 1005

Salário: 20.000

Gerente: 1000

Etapa 3) Criação de bloco anônimo para chamar o tipo de objeto criado por meio do construtor explícito para emp_no 1006

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

Resultado

Employee Name:PPPEmployee Number:1006Salary:20000Manager: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 o guru_emp_det como tipo de objeto de 'emp_object'.
  • Linha de código 50 : Instrução 'guru_emp_det.display_records' chamada de função de membro 'display_records' e os valores dos atributos são exibidos
  • Linha de código 51 : Instrução 'guru_emp_det.insert_records' chamada de função de 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 a seguir mostra como criar o tipo de objeto pai e herdado.

CREATE TYPE  AS OBJECT(,… )NOT FINAL;/

Explicação da sintaxe:

  • A sintaxe acima mostra a criação do tipo SUPER.
CREATE TYPEUNDER(,.);/

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.

Exemplo 1: No exemplo abaixo, vamos usar a propriedade de herança para inserir o registro com id de gerenciador como '1002' para o seguinte registro ('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.

Etapa 1) Criar tipo SUPER ou 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. Ele contém a definição de construtores com apenas 3 parâmetros. Ele foi declarado como 'NÃO FINAL', portanto, é do tipo pai.

Etapa 2) Crie o tipo SUB sob o tipo SUPER.

CREATE OR REPLACE TYPE sub_emp_objectUNDER emp_object(default_manager NUMBER,MEMBER PROCEDURE insert_default_mgr);/CREATE OR REPLACE TYPE BODY sub_emp_objectASMEMBER PROCEDURE insert_default_mgrISBEGININSERT INTO empVALUES(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 1 6 -21 : Definindo o procedimento de membro que está inserindo os registros na tabela "emp" com os valores do tipo de objeto 'SUPER', exceto para o valor do gerente. Para o valor do gerente, está usando o 'default_manager' do tipo 'SUB'.

Etapa 3) Criação de bloco anônimo para chamar o tipo SUB

DECLAREguru_emp_det sub_emp_object;BEGINguru_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 para o atributo default_manager
  • Linha de código 28 : Chamar o membro 'insert_default_mgr' para inserir os registros com o id de 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 chamado método 'ORDER'.

Este método 'ORDER' deve ser a função que retorna o tipo numérico. Recebe 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 da instância de dois objetos é comparado, e o resultado é retornado numérico.

  • O valor positivo representa que a instância do objeto SELF é maior do que outra instância.
  • O valor negativo representa que a instância do objeto SELF é menor do que outra instância.
  • Zero representa que a instância do objeto SELF é igual a outra instância.
  • Se qualquer uma das instâncias for nula, esta função retornará nula.
CREATE TYPE BODYAS OBJECT(ORDER MEMBER FUNCTION match(
 object_type_name_ 1)RETURN INTEGER IS BEGINIF parameter THENRETURN -1; --any negative number will doELSIF id>c.id THENRETURN 1; -any positive number will doELSERETURN 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.

Exemplo 1 : No exemplo a seguir, veremos como comparar dois objetos. Vamos criar duas instâncias e comparar o atributo 'salário' entre elas. Vamos realizar duas etapas inteiras.

  • Etapa 1: Criação do tipo e corpo do objeto.
  • Etapa 2: Criando o bloco anônimo para chamar compare a instância do objeto.

Etapa 1) Criação do 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 ASORDER MEMBER FUNCTION equals(c emp_object_equality)RETURN INTEGERISBEGIN‭ ‬IF salaryc.salaryTHEN RETURN 1;ELSERETURN 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 atributos 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

Etapa 2) Criando o bloco anônimo para chamar compare a instância do objeto.

DECLAREl_obj_l emp_object_equality;l_obj_2 emp_object_equality;BEGINl_obj_l:=emp_object_equality(15000);l_obj_2:=emp_object_equality(17000);IF l_obj_1.equalS(l_obj_2)>0THENDbms_output.put_line(’Salary of first instance is greater’):ELSIF l_obj_l.equalS(l_obj_2)<0THENDbms_output.put_line(’Salary of second instance is greater’);ELSEDbms_output.put_line(’Salaries are equal’);END IF;END;/

Resultado

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 : Imprima 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.