Records é um tipo de dado utilizado pela Oracle como um tipo de placeholder (espaço reservado), assim como os tipos variables e Constants. Os records (registros) são tipos de dados compostos utilizados para armazenar vários tipos de informações, o que significa que ele é uma combinação de diferentes tipos escalares como as do tipo char, date, varchar2, dentre outros. Cada um desses tipos de dados escalares contém um determinado valor e este pode ser visualizado como uma linha de dados da tabela e que pode conter todas as informações referentes a essa linha.

Declarando um Record

A estrutura básica para declararmos um Record é definindo primeiramente um tipo de dados composto e após isso, declaramos um record para este tipo. Vejamos na Listagem 1 a sintaxe geral para a definição deste tipo de dados composto.

TYPE record_type_name IS RECORD
(first_col_name column_datatype,
second_col_name column_datatype, ...); 
Listagem 1. Declarando um tipo de dados composto e criando um record.

Esta é a definição base de criação de um record, mas vamos explicar um pouco sobre cada termo importante neste conjunto de informações:

  • Record_type_name: este será o nome atribuído ao tipo de dados composto que pretendemos criar.
  • First_col_name, second_col_name, ...: estes serão os nomes dos campos ou colunas dentro do record.
  • Column_datatype: este item define os tipos de dados escalares dos campos passados.

Como informado, esta é a forma básica para definirmos um record, mas podemos ter diferentes caminhos para definir os tipos de dados dos campos. Com base nisso, temos então duas formas:

  1. Podemos declarar os campos da mesma forma que declaramos os campos enquanto criamos a tabela.
  2. Ou se um campo é baseado em uma coluna da tabela da base de dados, podemos então definir o tipo de campo da seguinte forma: col_name table_name.column_name%type;

Declarando o tipo de dado do campo em ambos os métodos utilizando a expressão %type, o tipo de dado da coluna é dinamicamente aplicado para o campo. Este método é de grande utilidade quando você altera as especificações de uma coluna de uma tabela específica devido ao fato de não precisar mudar novamente o seu código. Da mesma forma, você pode aplicar o %type quando precisar definir Constants e variables.

Agora que definimos como criar um tipo de dado record, como fazemos para utilizá-lo? De uma maneira geral, a sintaxe utilizada para a sua utilização é a mesma da Listagem 2.

Record_name record_type_name; 
Listagem 2. Utilizando o Record criado.

Para melhor visualização da informação acima, vejamos um exemplo simples de sua utilização na Listagem 3.

DECLARE
TYPE empregado_tipo IS RECORD (
  id empregado.id number(5),
  nome empregado.primeiro_nome varchar2(25),
  sobrenome empregado.sobrenome%type,
  dtAdmissao empregado.dataAdminissao%type,
  dtNascimento empregado.dataNascimento%type,
  departamento empregado.dept_empregado%type,
  salario empregado.salario_empregado%type
);  empregado_rec empregado_tipo;
/* Percebam a utilização do %type para recuperar
dinamicamente o tipo de dado de alguns campos. */


Listagem 3. Exemplo prático da utilização de um record PL/SQL.

Se todos os campos do record são baseados nas colunas das tabelas de uma base de dados, então também podemos declarar um record de acordo com a Listagem 4.

record_name table_name%ROWTYPE; 
Listagem 4. Definição de Record utilizando %ROWTYPE.

Temos aqui basicamente a mesma declaração que foi definida anteriormente, com a diferença de que nesta estamos utilizando a expressão %ROWTYPE. Vejamos as vantagens de utilizar esta expressão ao invés de utilizarmos a expressão %TYPE.

Vantagens de utilizar a expressão %ROWTYPE:

  1. A primeira vantagem seria que não precisaríamos declarar explicitamente variáveis para cada um dos tipos de colunas das tabelas.
  2. Se em algum momento você precisar mudar alguma especificação das colunas na base de dados, não seria preciso atualizar o código.

A desvantagem é que quando criamos um record utilizando o %ROWTYPE, campos serão criados para cada uma das colunas da tabela e será utilizada uma determinada quantidade de memória para armazenar estas informações, o que a cada modificação realizada seria despendida mais memória para esse armazenamento. Com isso, é mais apropriado a utilização da expressão %ROWTYPE quando estivermos usando realmente todas as colunas da tabela. Caso sejam apenas alguns campos, o melhor é utilizarmos a expressão %TYPE.

Nota: quando estamos criando um record, estamos criando justamente um tipo de dado similar à quando criamos uma variável (variable). Nós precisamos atribuir valores a eles para podermos utilizá-los.

Passando valores para/de um record

Quando atribuímos valores para um record, estamos na realidade atribuindo valores dentro de cada um de seus campos. A sintaxe geral para atribuirmos valores diretamente para uma coluna dentro do record é a mesma da Listagem 5.

record_name.col_name := value; 
Listagem 5. Atribuição direta de valores para campos num record.

Se estivermos utilizando a expressão %ROWTYPE para declararmos um record, podemos então atribuir os valores da seguinte forma:

record_name.column_name := value; 

De maneira similar, podemos atribuir os valores para um record utilizando instruções SELECT como apresentado na Listagem 6.

SELECT col1, col2
INTO record_name.col_name1, record_name.col_name2
FROM table_name
[WHERE clause]; 
Listagem 6. Atribuindo valores através de instruções selects.

Se utilizarmos o %ROWTYPE para declarar um record, poderíamos então atribuir diretamente valores para todo o record ao invés de passar para cada uma das colunas separadamente. Neste caso, teríamos que selecionar todas as colunas da tabela para o registro (percebeu o problema em caso de muitas colunas? Tipo, umas 30 colunas, por exemplo?). Vejamos na Listagem 7 como ficaria a declaração do record em caso de utilizarmos a expressão %ROWTYPE.

SELECT * INTO record_name
FROM table_name
[WHERE clause]; 
Listagem 7. Atribuição de valores para um record utilizando o %ROWTYPE.

Vejamos agora como podemos recuperar valores de um record pré-definido. A sintaxe geral para a recuperação dos valores dos campos específicos para outras variáveis é:

var_name := record_name.col_name; 

Para solidificarmos o nosso conhecimento desta nova gama de informações, vamos defini-las todas numa tabela para facilitar nossos estudos. Segue a Tabela 1.

Sintaxe geral

Usabilidade

Record_name.col_name := value;

Utilizada para atribuir diretamente os valores para uma coluna especifica do record.

Record_name.column_name := value;

Utilizada para atribuir diretamente um valor para uma coluna especifica de um record, se o record for declarado usando a expressão %ROWTYPE.

SELECT col1, col2 INTO record_name.col_name1, record_name.col_name2 FROM table_name [WHERE clause];

Utilizada para atribuir valores para cada campo de um record de uma tabela da base de dados.

SELECT * INTO record_name FROM table_name [WHERE clause];

Utilizada para atribuir valores para todos os campos de um record de uma tabela da base de dados.

Variable_name := record_name.col_name;

Esta é utilizada para obter um valor de uma coluna do record para atribuí-la a uma outra variável.

Com isso então concluímos este artigo apresentando de forma simples e objetiva com relação a utilização de records, suas variadas sintaxes e definições de como podemos utilizá-lo de forma que possibilite a melhoria do código e o desempenho de nossas aplicações. Agora que sabemos com relação a algumas de suas particularidades, torna-se mais fácil a sua utilização dependendo do caso em que estaremos aplicando este conceito. Espero que tenham gostado do artigo e em caso de dúvidas, deixem comentários e terei prazer em responde-los. Até a próxima!