Guia Linguagem SQL

PL SQL Placeholders: Como definir o tipo de dados

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (3)  (0)

Veja nesse artigo o terceiro tipo de placeholder existente na linguagem de programação PL/SQL da Oracle. Será abordado as principais definições de utilização de records, assim como são declarados e para que precisamos utilizá-lo

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.

Listagem 1. Declarando um tipo de dados composto e criando um record.

TYPE record_type_name IS RECORD 
  (first_col_name column_datatype, 
  second_col_name column_datatype, ...); 

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.

Listagem 2. Utilizando o Record criado.

Record_name record_type_name; 

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

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

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

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.

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

record_name table_name%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.

Listagem 5. Atribuição direta de valores para campos num record.

record_name.col_name := value; 

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.

Listagem 6. Atribuindo valores através de instruções selects.

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

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.

Listagem 7. Atribuição de valores para um record utilizando o %ROWTYPE.

SELECT * INTO record_name 
  FROM table_name 
  [WHERE clause]; 

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!

 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Receba nossas novidades
Ficou com alguma dúvida?