Oracle Tipos de objetos PL/SQL: CREATE TYPE com exemplos

⚡ Resumo Inteligente

Os tipos de objeto em PL/SQL trazem a programação orientada a objetos para... Oracle, permitindo que você modele entidades do mundo real com atributos e métodos. Elas suportam construtores, herança e comparação de igualdade, de modo que um único tipo em nível de esquema possa armazenar e processar dados estruturados.

  • 🧱 Componentes do tipo objeto: Um tipo de objeto combina atributos que armazenam dados e membros, ou métodos, que definem sua lógica de processamento.
  • ???? Criar objeto: Os tipos de objeto são criados no nível do esquema com CREATE TYPE, e seus métodos são definidos em um CREATE TYPE BODY separado.
  • 🔧 Construtores: Cada tipo de objeto possui um construtor implícito com o mesmo nome do tipo, e você pode definir um construtor explícito para definir valores padrão.
  • 🧬 Herança: Um tipo pai NOT FINAL é estendido com UNDER, de modo que um subtipo herda todos os atributos e membros do tipo pai.
  • ⚖️ Igualdade: A função membro ORDER compara duas instâncias de objeto e retorna um número negativo, zero ou positivo.
  • 🤖 Assistência de IA: Assistentes de IA, como o GitHub Copilot, elaboram definições de tipo CREATE, construtores e métodos ORDER a partir de um comentário.

Oracle Tipos de objetos PL/SQL mostrando CREATE TYPE com atributos e métodos.

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 aplicações complexas. Os programas são organizados em torno de "objetos" em vez de "ações"; ou seja, são projetados para trabalhar e interagir com um objeto inteiro, em vez de uma única ação. Essa abordagem permite ao programador preencher e manipular detalhes no nível da entidade do objeto.

A imagem abaixo ilustra um exemplo de um tipo de objeto no qual uma conta bancária é tratada como uma entidade objeto. Os atributos do objeto armazenam valores — para uma conta bancária, esses valores são o número da conta, o saldo bancário e assim por diante — enquanto os métodos do objeto descrevem ações como calcular a taxa de juros ou gerar um extrato bancário, cada uma das quais requer um processo para ser concluída.

Conta bancária modelada como um tipo de objeto com atributos e métodos em PL/SQL

In PL/SQLA programação orientada a objetos baseia-se em tipos de objetos. Um tipo de objeto pode representar qualquer entidade do mundo real. As seções a seguir exploram os tipos de objetos, seus componentes e como criá-los e usá-los.

Componentes de tipos de objetos

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

  1. Atributos
  2. Membros/Métodos

Atributos

Atributos são as colunas ou campos nos quais os dados são armazenados. Cada atributo é mapeado para o tipo de dados que define o processamento e o tipo de armazenamento desse atributo. Um atributo pode ser de qualquer tipo 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 dentro do tipo de objeto. Não são usados ​​para armazenar dados; em vez disso, definem o processamento realizado dentro do tipo de objeto — por exemplo, validar dados antes de preencher o objeto. São declarados na especificação do tipo de objeto e definidos no corpo do tipo de objeto. O corpo é opcional: se não houver membros presentes, um tipo de objeto não terá corpo.

Criar objeto em Oracle

Um tipo de objeto não pode ser criado no nível do subprograma; ele só pode ser criado no nível do esquema. Uma vez definido no esquema, o tipo de objeto pode ser usado em subprogramas. O tipo de objeto é criado usando a instrução “CREATE TYPE”, e o corpo do tipo só pode ser criado depois que o tipo de objeto existir.

As capturas de tela abaixo mostram a sintaxe CREATE TYPE para a especificação do objeto e a sintaxe CREATE TYPE BODY que define seus métodos.

A sintaxe CREATE TYPE define uma especificação de objeto com atributos em Oracle A sintaxe CREATE TYPE BODY define os métodos de um tipo de objeto PL/SQL.

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 um OBJETO com atributos e um CORPO DE OBJETO com métodos.
  • Os métodos também podem estar sobrecarregados no corpo do objeto.

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

Assim como outros componentes em PL/SQL, os tipos de objeto devem ser declarados antes de serem usados ​​em um programa. Uma vez criado, o tipo de objeto pode ser usado na seção declarativa de um subprograma para declarar uma variável desse tipo de objeto.

Sempre que uma variável é declarada como um tipo de objeto, em tempo de execução, uma nova instância desse tipo de objeto é criada, e essa instância recém-criada é referenciada pelo nome da variável. Dessa forma, um único tipo de objeto pode armazenar múltiplos valores em instâncias diferentes.

A captura de tela abaixo mostra uma variável sendo declarada como um tipo de objeto dentro de um Bloco PL/SQL.

Declaração de uma variável de um tipo de objeto em uma seção declarativa de bloco PL/SQL

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

Explicação da sintaxe:

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

Uma vez que a variável é declarada como um tipo de objeto em um subprograma, ela é atomicamente nula — o objeto inteiro em si é nulo. Ela deve ser inicializada com valores antes de poder ser usada no programa. Os objetos são inicializados usando construtores.

Construtores são métodos implícitos de um objeto que podem ser referenciados com o mesmo nome do tipo do objeto. A captura de tela abaixo mostra a inicialização de uma instância de um tipo de objeto.

Inicializando uma instância de um tipo de objeto com o valor nulo usando seu construtor.

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.
  • O objeto em si deixa de ser nulo após ser inicializado, mas os atributos dentro do objeto permanecem nulos até que valores sejam atribuídos a eles.

Construtores

Construtores são métodos implícitos de um objeto que podem ser referenciados com o mesmo nome do tipo do objeto. Sempre que o objeto é referenciado pela primeira vez, esse construtor é chamado implicitamente.

Você também pode inicializar objetos usando esses construtores. Um construtor pode ser definido explicitamente definindo um membro no corpo do tipo de objeto com o mesmo nome do tipo de objeto.

1 exemplo: No exemplo a seguir, usamos o membro do tipo objeto para inserir registros na tabela `emp` com os valores ('RRR', 1005, 20000, 1000) e ('PPP', 1006, 20000, 1001). Após a inserção dos dados, os exibimos usando o membro do tipo objeto. Também usamos um construtor explícito para preencher o `manager id` com o valor padrão 1001 para o segundo registro.

Executamos isso seguindo os passos abaixo.

  • Passo 1: Crie o tipo de objeto e o corpo do tipo de objeto.
  • Passo 2: Crie um bloco anônimo para chamar o tipo de objeto através do construtor implícito para emp_no 1005.
  • Etapa 3: Crie um bloco anônimo para chamar o tipo de objeto através do construtor explícito para emp_no 1006.

Passo 1) Crie o tipo de objeto e o corpo do tipo de objeto.

A captura de tela abaixo mostra a especificação do tipo de objeto emp_object sendo criada com seus atributos e membros.

Criando a especificação do tipo de objeto emp_object com atributos e membros.

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

A captura de tela abaixo mostra o corpo do tipo emp_object sendo criado com o construtor explícito e os procedimentos membro.

Definindo o corpo do tipo emp_object com um construtor explícito e procedimentos de membro.

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.manager:=1001;
RETURN;
END;
MEMBER PROCEDURE insert_records
IS
BEGIN
INSERT INTO emp VALUES(emp_no,emp_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;
/

Code Explicação

  • Code linhas 1-9: Criando o tipo de objeto 'emp_object' com 4 atributos e 3 membros. Ele contém a definição de um construtor com apenas 3 parâmetros. (O construtor implícito real contém um número de parâmetros igual ao número de atributos presentes no tipo de objeto.)
  • Code linha 10: Criando o corpo do texto.
  • Code linhas 11-21: Definindo o construtor explícito. Atribuindo os valores dos parâmetros aos atributos e atribuindo ao atributo 'manager' o valor padrão '1001'.
  • Code linhas 22-26: Definindo o membro 'insert_records', no qual os valores dos atributos são inseridos na tabela 'emp'.
  • Code linhas 27-34: Definindo o membro 'display_records', que exibe os valores dos atributos do tipo objeto.

Saída:

Tipo criado

Digite corpo criado

Passo 2) Criando um bloco anônimo para chamar o tipo de objeto criado através do construtor implícito para emp_no 1005.

A captura de tela abaixo mostra o bloco anônimo que chama emp_object através do construtor implícito.

Bloco anônimo chamando emp_object 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;

Code Explicação

  • Code linhas 37-45: Inserindo os registros usando o construtor implícito. A chamada ao construtor contém o número real de valores de atributo.
  • Code linha 38: Declara 'guru_emp_det' como um objeto do tipo 'emp_object'.
  • Code linha 41: A instrução 'guru_emp_det.display_records' chama o membro 'display_records' e os valores dos atributos são exibidos.
  • Code linha 42: A instrução 'guru_emp_det.insert_records' chama o membro 'insert_records' e os valores dos atributos são inseridos na tabela. O bloco então confirma a operação. transação.

Saída:

Nome do funcionário: RRR

Número do funcionário: 1005

Salário: 20000

Gerente: 1000

Passo 3) Criando um bloco anônimo para chamar o tipo de objeto criado através do construtor explícito para emp_no 1006.

A captura de tela abaixo mostra o bloco anônimo que chama emp_object através do construtor explícito com três argumentos.

Bloco anônimo chamando emp_object 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

Code Explicação:

  • Code linhas 46-53: Inserindo o registro usando o construtor explícito.
  • Code linha 46: Declara 'guru_emp_det' como um objeto do tipo 'emp_object'.
  • Code linha 50: A instrução 'guru_emp_det.display_records' chama o membro 'display_records' e os valores dos atributos são exibidos.
  • Code linha 51: A instrução 'guru_emp_det.insert_records' chama o membro 'insert_records' e os valores dos atributos são inseridos na tabela. Como apenas três argumentos são passados, o construtor explícito define o ID do gerente para seu valor padrão, 1001.

Herança no tipo de objeto

A propriedade de herança permite que um subtipo de objeto acesse todos os atributos e membros do supertipo de objeto, ou tipo de objeto pai.

O tipo de subobjeto é chamado de tipo de objeto herdado, e o tipo de objeto super é chamado de tipo de objeto pai. A sintaxe abaixo mostra como criar tipos de objeto pai e herdado. A captura de tela abaixo mostra a sintaxe do tipo pai (SUPER) marcada como NÃO FINAL.

Sintaxe CREATE TYPE para um tipo de objeto pai NOT FINAL usado em herança.

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. A cláusula NOT FINAL permite que o tipo seja herdado.

A captura de tela abaixo mostra a sintaxe do tipo herdado (SUB) criada com a palavra-chave UNDER.

Sintaxe CREATE TYPE UNDER para um subtipo de objeto que herda de um tipo pai.

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.

1 exemplo: No exemplo abaixo, usamos a propriedade de herança para inserir um registro com o ID do gerente '1002' para o registro ('RRR', 1007, 20000). Executamos o programa nas seguintes etapas.

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

Passo 1) Crie um tipo SUPER ou um tipo pai.

A captura de tela abaixo mostra o supertipo emp_object sendo criado com a cláusula NOT FINAL.

Criando o supertipo emp_object NOT FINAL para o exemplo de herança

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

Code Explicação:

  • Code linhas 1-9: Criando o tipo de objeto 'emp_object' com 4 atributos e 3 membros. Ele contém a definição de um construtor com apenas 3 parâmetros. Foi declarado como 'NOT FINAL', portanto é um tipo pai.

Passo 2) Crie um tipo SUB sob o tipo SUPER.

A captura de tela abaixo mostra o tipo herdado sub_emp_object e seu corpo sendo criado.

Criando o tipo herdado sub_emp_object e seu corpo com insert_default_mgr

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

Code Explicação:

  • Code linhas 10-13: Criando 'sub_emp_object' como o tipo herdado com um atributo adicional 'default_manager' e uma declaração de procedimento membro.
  • Code linha 14: Criando o corpo para o tipo de objeto herdado.
  • Code linhas 16-21: Define o procedimento membro que insere registros na tabela 'emp' com os valores do tipo de objeto SUPER, exceto o valor do gerente. Para o valor do gerente, utiliza 'default_manager' do tipo SUB.

Etapa 3) Criando um bloco anônimo para chamar o tipo SUB.

A captura de tela abaixo mostra o bloco anônimo que chama o tipo SUB e insere o ID do gerenciador padrão.

Bloco anônimo que chama o tipo sub_emp_object para inserir um ID de gerente padrão.

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

Code Explicação:

  • Code linha 25: Declarando 'guru_emp_det' como tipo 'sub_emp_object'.
  • Code linha 27: Inicializando o objeto com o construtor implícito. O construtor possui 5 parâmetros (4 atributos do tipo PARENT e 1 atributo do tipo SUB). O último parâmetro (1002) define o valor para o atributo default_manager.
  • Code linha 28: Chamando o membro 'insert_default_mgr' para inserir o registro com o ID do gerente padrão passado no construtor.

Igualdade de objetos PL/SQL

Instâncias de objetos que pertencem ao mesmo tipo de objeto podem ser comparadas para verificar igualdade. Para isso, o tipo de objeto precisa de um método especial chamado método ORDER.

Este método ORDER deve ser uma função que retorna um tipo numérico. Ele recebe dois parâmetros como entrada (primeiro parâmetro: o ID da instância do objeto; segundo parâmetro: o ID de outra instância do objeto).

Os IDs das duas instâncias de objeto são comparados e o resultado é retornado como um número.

  • Um valor positivo indica que a instância do objeto SELF é maior que a outra instância.
  • Um valor negativo indica que a instância do objeto SELF é menor que a outra instância.
  • O valor zero indica que a instância do objeto SELF é igual à outra instância.
  • Se alguma das instâncias for nula, a função retorna nulo.

A captura de tela abaixo mostra a sintaxe da função membro ORDER que deve ser incluída no corpo do tipo para a verificação de igualdade.

A sintaxe da função membro ORDER é usada para comparar instâncias de objetos quanto à igualdade.

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 deve ser incluída no corpo do tipo para a verificação de igualdade.
  • O parâmetro para esta função deve ser uma instância do mesmo tipo de objeto.
  • A função pode ser chamada como “obj_instance_1.match(obj_instance_2)”, e essa expressão retorna o valor numérico mostrado, onde obj_instance_1 e obj_instance_2 são instâncias do tipo objeto.

1 exemplo: No exemplo a seguir, comparamos dois objetos. Criamos duas instâncias e comparamos o atributo 'salário' entre elas. Fazemos isso em duas etapas.

  • Passo 1: Crie o tipo e o corpo do objeto.
  • Etapa 2: Crie o bloco anônimo para comparar as instâncias do objeto.

Etapa 1) Criando o tipo e o corpo do objeto.

As capturas de tela abaixo mostram a especificação emp_object_equality e seu corpo, que define a função ORDER que compara o atributo de salário.

Criando a especificação do tipo de objeto emp_object_equality com uma função ORDER Definindo o corpo do tipo emp_object_equality que compara o atributo salary.

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

Code Explicação:

  • Code linhas 1-4: Criando o tipo de objeto 'emp_object_equality' com 1 atributo e 1 membro.
  • Code linhas 6-16: Define a função ORDER que compara o atributo 'salário' da instância SELF com o da instância do parâmetro. Ela retorna um valor negativo se o salário de SELF for menor, um valor positivo se o salário de SELF for maior e 0 se os salários forem iguais.

Code Saída:

Tipo criado

Etapa 2) Criação do bloco anônimo para comparar as instâncias do objeto.

A captura de tela abaixo mostra o bloco anônimo que compara duas instâncias de emp_object_equality pelo salário.

Bloco anônimo comparando duas instâncias de emp_object_equality pelo salário

DECLARE
l_obj_1 emp_object_equality;
l_obj_2 emp_object_equality;
BEGIN
l_obj_1:=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_1.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

Code Explicação:

  • Code linha 20: Declarando 'l_obj_1' do tipo 'emp_object_equality'.
  • Code linha 21: Declarando 'l_obj_2' do tipo 'emp_object_equality'.
  • Code linha 23: Inicializando 'l_obj_1' com o valor salarial '15000'.
  • Code linha 24: Inicializando 'l_obj_2' com o valor salarial '17000'.
  • Code linhas 25-33: Imprimindo a mensagem com base no número retornado pela função ORDER.

Perguntas Frequentes

Um tipo de objeto modela uma única entidade do mundo real com atributos e métodos. coleção — um VARRAY, tabela aninhada ou matriz associativa — contém vários elementos de um mesmo tipo de dado. Os tipos de objeto descrevem a estrutura e o comportamento, enquanto as coleções armazenam múltiplos valores.

Ambos comparam instâncias de objetos. Um método MAP retorna um único valor escalar que Oracle O método `sort` é usado para ordenar ou comparar objetos, enquanto o método `ORDER` compara duas instâncias diretamente e retorna um número negativo, zero ou positivo. Um tipo pode definir um ou outro, mas não ambos.

Sim. Você pode criar uma tabela de objetos onde cada linha é uma instância de objeto, ou usar um tipo de objeto como tipo de dados de uma coluna da tabela. Isso permite Oracle Persistir objetos estruturados diretamente no banco de dados, em vez de apenas na memória.

Um tipo NÃO INSTANTÁVEL não pode criar objetos diretamente; ele age como um objeto absoluto.tract base que outros tipos estendem. Combinado com NOT FINAL, define um supertipo cujos subtipos fornecem a implementação concreta de seus métodos declarados.

Use ALTER TYPE para adicionar ou remover atributos e métodos, adicione CASCADE para atualizar objetos dependentes e use DROP TYPE para remover o tipo. Um tipo ainda usado por tabelas ou outros tipos não pode ser removido até que essas dependências sejam tratadas primeiro.

Consulte as views do dicionário de dados USER_TYPES e ALL_TYPES para obter os nomes dos tipos, e USER_TYPE_ATTRS e USER_TYPE_METHODS para obter seus atributos e métodos. Essas views permitem auditar um modelo de objeto existente sem precisar ler o código-fonte.

Sim. Travas deslizantes portáteis Copiloto do GitHub Rascunhos de especificações CREATE TYPE, métodos TYPE BODY, construtores e funções ORDER a partir de um comentário. RevVisualize os tipos de dados dos atributos, os parâmetros do construtor e as cláusulas de herança antes de implantar o tipo gerado.

Assistentes de IA analisam suas tabelas e sugerem tipos de objetos e mapas de atributos.pinge hierarquias de herança. Essa revisão de aprendizado de máquina sinaliza atributos redundantes, construtores ausentes e herança excessivamente profunda antes que o modelo de objeto chegue à produção, melhorando a capacidade de manutenção.

Resuma esta postagem com: