Nesse post vou falar um pouco sobre os tipos de variáveis do PL/SQL. Resolvi dividir o tema em duas postagens(Parte 1 e
Parte 2), pois é muito conteúdo e muito detalhe para uma única postagem.
Variável Escalar
O tipo mais simples de variável, deriva dos tipos de dados validos para colunas de tabelas no banco de dados Oracle, esse tipo é utilizado para representar objetos de dados de tamanho fixo individuais, tais como inteiros e ponteiros.
As variáveis do tipo escalar também podem ser usadas para compor objetos de tamanho fixo que são compostos de um ou mais tipos primitivos ou compostos.
O grupo de variáveis do tipo escalar pode ser subdividido da seguinte forma:
- Variável escalar numérica
- Variável escalar Caracteres
- Variável escalar Data Intervalo
- Variável escalar booleana
Variável escalar numérica
São as variáveis utilizadas para armazenar números inteiros ou valores reais. Existem três derivações deste tipo de variável no PL/SQL: NUMBER, PLS_INTEGER e BINARY_INTEGER.
O tipo NUMBER, é o mais utilizado, pode receber dois parâmetros adicionais, que são a precisão e a escala, NUMBER (P,E), onde “P” (precisão) informa a quantidade de dígitos que a variável pode receber (incluindo os dígitos decimais) e “E” (escala) informa quantos dos dígitos serão valores decimais. Ambos os parâmetros são opcionais, a precisão pode ser especificada ente 1 e 38 e a escala entre –84 e 127, a escala não pode ser maior que a precisão.
Para representar valores inteiros, define-se a escala como zero. Se a escala não for definida, o valor default é 0.
O tipo NUMBER tem subtipos, são eles: DEC, DECIMAL, DOUBLE PRECISION, FLOAT, INTEGER, INT, NUMERIC, REAL, SMALLINT.
Exemplos de utilização de precisão e escala nas variáveis numéricas:
Já os tipos PLS_INTEGER e BINARY_INTEGER armazenam
apenas números inteiros entre -2.147.483.647 e 2.147.483.647. Eles ocupam menos espaço que o tipo NUMBER.
As operações sobre PLS_INTEGER utilizam a aritmética de máquina. Por isso são mais rápidas que as operações sobre NUMBER e BINARY_INTEGER. Porem o PLS_INTEGER sempre levanta uma exceção do oracle quando que ocorre um overflow. Já os tipos PLS_INTEGER e BINARY_INTEGER armazenam apenas números inteiros na entre -2.147.483.647 e 2.147.483.647. Eles ocupam menos espaço que o tipo NUMBER.
O tipo BINARY_INTEGER tem os seguintes subtipos:
o NATURAL e POSITIVE: restringem um inteiro a valores não negativos e positivos respectivamente.
o NATURALN e POSITIVEN não permitem valores NULL, deve ser atribuído um valor na declaração.
o SIGNTYPE restringem valores inteiros a –1, 0 e 1.
Até a versão do Oracle9i o tipo PLS_INTEGER era mais performático que o BINARY_INTEGER porem a partir da versão Oracle10g essa diferença foi extinta.
Variável escalar Caracteres
São variáveis de texto podem ser subdivididas em 6 tipos CHAR, VARCHAR2, NCHAR, NVARCHAR2, LONG e LONG RAW.
O tipo CHAR(B) é utilizado para gravar textos de tamanho fixo podendo receber um parâmetro(B), que deverá ser um numero inteiro positivo, ate a versão 8i o tamanho da variável era definido em bytes a partir da versão 9i é possível definir o tamanho da variável em caracteres ou em bytes, caso a parâmetro não seja colocado o valor default é 1.
É importante destacar que a variável do tipo CHAR sempre terá o tamanho que foi definido na declaração. Exemplo: se a variável for declarada com CHAR(3) e o valor atribuído for “S” o valor armazenado na variável será “S __ “(o símbolo “_” representa espaço em branco), pois o banco completa com espaços em branco alocando assim sempre o tamanho atribuído a variável em bytes de memoria.
O tipo NCHAR foi criado para armazenar caracteres não romanos que precisam de mais espaço para armazenamento ele é muito parecido ao CHAR tendo como principal diferença o fato que seu tamanho poder ser definido em número de caracteres.
Para o tipo VARCHAR2 o parâmetro que define o tamanho máximo é obrigatório deve ser um inteiro positivo ate a versão 8i o tamanho da variável era definido em bytes a partir da versão 9i é possível definir o tamanho da variável em caracteres ou em bytes. Ao contrario do tipo CHAR quando o tamanho do valor atribuído a variável for menor que o definido na declaração a variável vai ocupar apenas o espaço referente ao tamanho do valor atribuído, pois o tamanho é variável.
O tipo NVARCHAR2 tem o mesmo objetivo que o NCHAR, tendo o mesmo comportamento que o VARCHAR2, com a vantagem de aceitar caracteres especiais.
Há também os tipos LONG e LONG RAW que são strings de tamanhos variáveis, porem na versão 11g a Oracle recomenda que sejam usados apenas para compatibilidade retrógada. O CLOB ou NCLOB substitui o LONG e o BLOB ou BFILE substitui o LONG RAW ( na próxima postagem vou detalhar esse tipos de variaveis).
Variável escalar Data Intervalo
São variáveis para tratamento e armazenamento de data e hora e intervalos.
As variáveis do tipo DATE aceitam valores entre primeiro de janeiro de 1,4712 AEC (Antes da Era Comum) até 31 de dezembro de 9999 EC( Era comum). A data é armazenada por padrão no formato “DD/MM/YY HH:MM:SS”.
As variáveis do tipo TIMESTAMP tem quase a mesma funcionalidade que as variáveis DATE porem estas armazenam a data com maior exatidão de tempo, por padrão as datas são armazenadas nessa variável no formato “DD/MM/YY HH:MM:SS.”.
Variável escalar booleana
Uma variável do tipo BOOLEANA aceita 2 valores (true e false) e aceita o status NULL, o que pode trazer grandes problemas de validação no codigo.
Eu recomendo que ao declarar a variável já seja realizada a atribuição de valores, a declaração com atribuição de valores pode ser feita da seguinte forma:
v_teste BOOLEAN := TRUE;
Referências :
Livro: PL/SQL Programação do Michel MCLaughlin
Sites:
TCC: Análise de Mapeamento de Classes em Tabelas em Banco de dados Objeto – Relacional de Rodrigo Marcel Siqueira de Arruda