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.

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.
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.
- Atributos
- 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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.


















