Oracle Tipo de registros PL/SQL com exemplos

โšก Resumo Inteligente

O tipo de registro PL/SQL รฉ um tipo de dados complexo que agrupa vรกrias colunas, cada uma com seu prรณprio nome e tipo de dados, em um novo tipo. Um registro pode ser definido no nรญvel do banco de dados como um objeto armazenado ou dentro de um subprograma, e seus campos sรฃo acessados โ€‹โ€‹com o operador ponto.

  • ๐Ÿงฑ Definiรงรฃo: Um tipo de registro agrupa uma ou mais colunas em um รบnico novo tipo de dados.
  • ๐Ÿ”‘ Palavra-chave: A palavra-chave TYPE informa ao compilador que um novo tipo de dados estรก sendo criado.
  • ๐Ÿ›๏ธ Dois nรญveis: Um registro em nรญvel de banco de dados รฉ um objeto armazenado; um registro em nรญvel de subprograma รฉ visรญvel apenas dentro desse subprograma.
  • ๐Ÿ”— Acesso ao campo: Os campos sรฃo acessados โ€‹โ€‹como variรกvel_de_registro.nome_da_coluna usando o operador ponto.
  • ๐Ÿ“ฅ Nรญvel da coluna: ร‰ possรญvel atribuir valores a um campo de cada vez.
  • ๐Ÿ“ฆ Nรญvel de linha: A instruรงรฃo SELECT INTO pode preencher um registro inteiro a partir de uma linha da tabela.
  • ๐Ÿงฉ Tipos de registro: Registros %ROWTYPE baseados em tabela, %ROWTYPE baseados em cursor e registros definidos pelo programador.

Oracle Tipo de registros PL/SQL

O que รฉ um tipo de registro?

Um tipo de registro รฉ um tipo de dado complexo que permite ao programador criar um novo tipo de dado com a estrutura de colunas desejada. Suas principais caracterรญsticas sรฃo:

  • Agrupa uma ou mais colunas para formar um novo tipo de dados.
  • Cada uma dessas colunas possui seu prรณprio nome e tipo de dados.
  • Um tipo de registro pode aceitar os dados como um รบnico registro composto por vรกrias colunas, ou pode aceitar o valor de uma coluna especรญfica de um registro.
  • Um tipo de registro รฉ simplesmente um novo tipo de dado. Uma vez criado, ele รฉ armazenado como um novo tipo de dado e pode ser usado para declarar uma variรกvel em programas.
  • Utiliza a palavra-chave 'TIPO' Para instruir o compilador de que um novo tipo de dados estรก sendo criado.
  • Pode ser criado no nรญvel de banco de dados, armazenado como um objeto de banco de dados e usado em todo o banco de dados, ou no nรญvel de subprograma, visรญvel apenas dentro do subprograma.
  • Um tipo de registro em nรญvel de banco de dados tambรฉm pode ser declarado para colunas de tabela, permitindo que uma รบnica coluna contenha dados complexos.
  • Os dados sรฃo acessados โ€‹โ€‹referenciando o nome da variรกvel, seguido por um ponto (.), e entรฃo o nome da coluna, como em ' . '.

Sintaxe para declarar um tipo de registro

Sintaxe para declaraรงรฃo no nรญvel do banco de dados:

Declaraรงรฃo do tipo de registro no nรญvel do banco de dados

CREATE TYPE <type_name_db> IS RECORD
(
<column 1> <datatype>,
);

Na primeira sintaxe, a palavra-chave 'CREATE TYPE' instrui o compilador a criar o tipo de registro denominado โ€œtype_name_dbโ€ com as colunas especificadas como um objeto de banco de dados. Isso รฉ fornecido como uma instruรงรฃo individual, nรฃo dentro de nenhum bloco.

Sintaxe para declaraรงรฃo no nรญvel do subprograma:

Declaraรงรฃo do tipo de registro no nรญvel do subprograma

DECLARE
TYPE <type_name> IS RECORD
(
<column1> <datatype>,
);
BEGIN
<execution_section>;
END;

Nessa sintaxe, criamos o tipo de registro denominado โ€œtype_nameโ€ somente dentro do subprograma. Em ambos os mรฉtodos, a forma de definir a coluna e o tipo de dados รฉ semelhante.

Exemplo 1: Tipo de registro como um objeto de banco de dados

Neste programa, veremos como criar um tipo de registro como um objeto de banco de dados. Criaremos o tipo de registro 'emp_det' com quatro colunas. As colunas e seus tipos de dados sรฃo:

  • EMP_NO (NรšMERO)
  • EMP_NAME (VARCHAR2 (150))
  • GERENTE (NรšMERO)
  • SALรRIO (NรšMERO)
CREATE TYPE emp_det IS OBJECT
(
EMP_NO NUMBER,
EMP_NAME VARCHAR2(150),
MANAGER NUMBER,
SALARY NUMBER
);
/

Saรญda:

Type created

Code Explicaรงรฃo

  • O cรณdigo acima cria o tipo emp_det como um objeto de banco de dados.
  • Possui 4 colunas: emp_no, emp_name, manager e salary, conforme definido.
  • Agora, 'emp_det' รฉ semelhante a qualquer outro. tipo de dados (como NUMBER ou VARCHAR2) e รฉ visรญvel em todo o banco de dados. Portanto, pode ser usado em qualquer lugar do banco de dados para declarar uma variรกvel desse tipo.

Exemplo 2: Acesso em nรญvel de coluna e nรญvel de subprograma

Neste exemplo, veremos como criar um tipo de registro no nรญvel do subprograma e como preenchรช-lo e recuperar valores por coluna. Criamos o tipo de registro 'emp_det' no nรญvel do subprograma e o utilizamos para preencher e exibir dados.

Exemplo de acesso em nรญvel de coluna do tipo de registro

DECLARE
TYPE emp_det IS RECORD
(
EMP_NO NUMBER,
EMP_NAME VARCHAR2(150),
MANAGER NUMBER,
SALARY NUMBER
);
guru99_emp_rec emp_det;
BEGIN
guru99_emp_rec.emp_no:= 1001;
guru99_emp_rec.emp_name:= 'XXX';
guru99_emp_rec.manager:= 1000;
guru99_emp_rec.salary:= 10000;
dbms_output.put_line('Employee Detail');
dbms_output.put_line ('Employee Number: '||guru99_emp_rec.emp_no);
dbms_output.put_line ('Employee Name: '||guru99_emp_rec.emp_name);
dbms_output.put_line ('Employee Salary: ' ||guru99_emp_rec.salary);
dbms_output.put_line ('Employee Manager Number: '||guru99_emp_rec.manager);
END;
/

Saรญda:

Employee Detail
Employee Number: 1001
Employee Name: XXX
Employee Salary: 10000
Employee Manager Number: 1000

Code Explicaรงรฃo

  • Code linhas 2-8: O tipo de registro 'emp_det' รฉ declarado com as colunas emp_no, emp_name, manager e salary dos tipos de dados NUMBER, VARCHAR2, NUMBER e NUMBER.
  • Code linha 9: A variรกvel guru99_emp_rec รฉ declarada como do tipo de dados 'emp_det'. Isso variรกvel pode armazenar um valor que contenha todos os quatro campos.
  • Code linha 11: Preenchendo o campo 'emp_no' de 'guru99_emp_rec' com valor 1001.
  • Code linha 12: Preenchendo o campo 'emp_name' com o valor XXX.
  • Code linha 13: Preenchendo o campo 'gerente' com o valor 1000.
  • Code linha 14: Preenchendo o campo 'salรกrio' com o valor 10000.
  • Code linhas 15-19: Exibindo o valor de 'guru99_emp_rec' na saรญda.

Exemplo 3: Acesso em nรญvel de linha e nรญvel de subprograma

Neste exemplo, veremos como criar um tipo de registro no nรญvel do subprograma e preenchรช-lo no nรญvel da linha. Criamos o tipo de registro 'emp_det' no nรญvel do subprograma e o utilizamos para preencher e exibir dados.

Exemplo de acesso em nรญvel de linha do tipo de registro

DECLARE
TYPE emp_det IS RECORD
(
EMP_NO NUMBER,
EMP_NAME VARCHAR2(150),
MANAGER NUMBER,
SALARY NUMBER
);
guru99_emp_rec emp_det;
BEGIN
INSERT INTO emp (emp_no, emp_name, salary, manager) VALUES (1002,'YYY',15000,1000);
COMMIT;
SELECT emp_no, emp_name, salary, manager INTO guru99_emp_rec FROM emp WHERE emp_no=1002;
dbms_output.put_line ('Employee Detail');
dbms_output.put_line ('Employee Number: '||guru99_emp_rec.emp_no);
dbms_output.put_line ('Employee Name: '||guru99_emp_rec.emp_name);
dbms_output.put_line ('Employee Salary: '||guru99_emp_rec.salary);
dbms_output.put_line ('Employee Manager Number: '||guru99_emp_rec.manager);
END;
/

Code Explicaรงรฃo

  • Code linhas 2-8: O tipo de registro 'emp_det' รฉ declarado com as colunas emp_no, emp_name, manager e salary dos tipos de dados NUMBER, VARCHAR2, NUMBER e NUMBER.
  • Code linha 9: A variรกvel guru99_emp_rec รฉ declarada como do tipo de dados 'emp_det' e pode conter todos os quatro campos.
  • Code linha 11: Preenchendo a tabela emp com 1002 como emp_no, YYY como emp_name, 15000 como salary e 1000 como manager number.
  • Code linha 12: Confirmando a transaรงรฃo de inserรงรฃo.
  • Code linha 13: Preenchendo a variรกvel 'guru99_emp_rec' no nรญvel da linha a partir da consulta SELECT para o funcionรกrio nรบmero 1002.
  • Code linhas 15-19: Exibindo o valor de 'guru99_emp_rec' na saรญda.

Saรญda:

Employee Detail
Employee Number: 1002
Employee Name: YYY
Employee Salary: 1000
Employee Manager Number: 15000

Observaรงรฃo: Um tipo de registro sรณ pode ser acessado no nรญvel da coluna ao redirecionar seu valor para qualquer modo de saรญda. Observe que, neste exemplo, a ordem da lista SELECT nรฃo corresponde ร  ordem dos campos do registro, razรฃo pela qual os valores de salรกrio e gerente aparecem trocados na saรญda.

Tipos de registros PL/SQL

Alรฉm do registro definido pelo programador mostrado acima, Oracle Oferece dois tipos de registros ancorados que copiam sua estrutura automaticamente. O uso deles evita a necessidade de redeclarar colunas e mantรฉm o registro sincronizado com a tabela ou o cursor em que se baseia.

Tipo de registro Declarado com A estrutura vem de
Registro baseado em tabela nome_da_tabela%TIPO_DE_LINHA Todas as colunas de uma tabela
Registro baseado em cursor cursor_name%ROWTYPE A lista de seleรงรฃo do cursor
Registro definido pelo programador TIPO โ€ฆ ร‰ REGISTRO Colunas que vocรช lista manualmente

Um registro %ROWTYPE รฉ a escolha mais segura quando o formato deve seguir uma tabela ou um... cursor, porque uma alteraรงรฃo de coluna รฉ detectada automaticamente na prรณxima compilaรงรฃo.

Perguntas Frequentes

Um registro agrupa diferentes colunas, possivelmente de tipos diferentes, em uma estrutura semelhante a uma linha. Uma coleรงรฃo contรฉm muitos elementos do mesmo tipo, indexados por um subscrito. Frequentemente, sรฃo combinados, formando uma coleรงรฃo de registros.

%ROWTYPE declara um registro cujos campos correspondem automaticamente a uma tabela ou cursor. Use-o quando o registro deve espelhar essa fonte, para que uma alteraรงรฃo em uma coluna seja refletida sem a necessidade de editar a declaraรงรฃo.

Sim, se ambos os registros forem do mesmo tipo. A clรกusula SELECT INTO tambรฉm pode preencher um registro inteiro a partir de uma linha da tabela, desde que a ordem da lista de seleรงรฃo corresponda ร  ordem dos campos do registro.

Sim. A IA consegue ler a definiรงรฃo de uma tabela e gerar um bloco TYPE โ€ฆ IS RECORD correspondente, ou recomendar um %ROWTYPE quando um link direto para a tabela for preferรญvel. Verifique os tipos de dados antes de usar.

Um registro de nรญvel de banco de dados รฉ criado com CREATE TYPE e armazenado como um objeto visรญvel em todo o banco de dados. Um registro de nรญvel de subprograma รฉ declarado dentro de um bloco e existe apenas dentro desse subprograma.

Resuma esta postagem com: