PL SQL Placeholders: Como definir o tipo de dados
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.
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:
- Podemos declarar os campos da mesma forma que declaramos os campos enquanto criamos a tabela.
- 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;
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. */
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;
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:
- A primeira vantagem seria que não precisaríamos declarar explicitamente variáveis para cada um dos tipos de colunas das tabelas.
- 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.
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;
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];
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];
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!
Artigos relacionados
-
Artigo
-
Artigo
-
Artigo
-
Artigo
-
Artigo