quarta-feira, 30 de outubro de 2013

Operadores

Hoje vou tratar de um tema simples porem super importante para programar em PL/SQL,tipo de operadores.

São os simbolos utilizados pela PL/SQL e pelo Oracle para tratar valores

Operadores aritméticos:
  • Soma: +
  • Subtração: -
  • Divisão: /
  • Exponenciação: ** (esse operador só é reconhecido pelo pl/sql)
Operadores de comparação
  • Diferente:  != e <>
  • Igual que:  =
  • Maior que: >
  • Menor que: <
  • Maior ou igual que: >= 
  • Menor ou igual que:<= 
  • Entre: BETWEEN
  • Campara se o valores esta entre dois valores.
  • Concatenar: || 
  • Parecido: LIKE 
Compara parte de um grupo de caracteres. Propriedades o simbolo "%" representa qualquer cadeia de caracteres de 0 ou mais caracteres e o simbolo "_" representa um único caractere qualquer. O select com o operador LIKE pode ter os seguintes comportamentos:

 SELECT c_nome FROM tb_teste WHERE c_nome LIKE 'A%' -- Retorna todos os nomes que começam com a letra "A"
 SELECT c_nome FROM tb_teste WHERE c_nome LIKE '%A%' -- Retorna todos os nomes que tenham a letra "A" em qualquer lugar.
 SELECT c_nome FROM tb_teste WHERE c_nome LIKE '_A%' -- Retorna apenas os nomes onde a segunda letra é "A".
 SELECT c_nome FROM tb_teste WHERE c_nome LIKE 'AB_' -- Retorna apenas  os nomes que comecem com "AB" e tenham apenas 3 letras.
 SELECT c_nome FROM tb_teste WHERE c_nome LIKE 'AB%' -- Retorna todos os nomes que comecem com "AB".
 SELECT c_nome FROM tb_teste WHERE c_nome LIKE '%' -- Retorna todos os nomes que contenham qualquer caracteres (não podem ser nulos).
  • Negação: Not
Nega todos os operadores retornando os resultado que o operador não retornaria. Exemplo:
          SELECT c_nome FROM tb_teste WHERE c_nome NOT LIKE 'A%' -- Retorna todos os nomes que não começam com a letra "A"
        • Dentro do: IN 
        Busca o resultado dentro de um grupo de valores, funciona como vários "ORs" concatenados. Exemplo:

         SELECT * FROM tb_teste WHERE c_idade = 18 or c_idade = or c_idade =  25  -- Retorna todos os registros da tabela onde a idade for 18 ou 9 ou 25. 

        Utilizando o operador IN ficaria assim:

        SELECT * FROM tb_teste WHERE c_idade in (18, 9, 25) -- Retorna todos os registros da tabela onde a idade for 18 ou 9 ou 25.


        Operadores lógicos:
        • E: AND
        Retorna positivo se todas as cláusulas forem verdadeiras.

        • Ou: OR 
        Retorna positivo se uma das cláusulas for verdadeira.





        Operadores de atribuição
        • Atribuir: ":=" ( dois pontos igual)
        Usado para atribuir um valor a variável. Exemplo:

        DECLARE
          v_teste NUMBER;
        BEGIN
          v_teste := 1;
        END;


        No código acima a variável  v_teste é declarada e posteriormente tem o valor um atribuído a ela.


        Bem esses são os principais operadores utilizados no PL/SQL! Espero que o post tenha ajudado qualquer duvida pode entrar em contato ou deixar nos comentários.





          sexta-feira, 25 de outubro de 2013

          Tipos de Variáveis – Parte 2


          Nesse post vou continuar o falando sobre os tipos de variáveis do PL/SQL.
          O incio da postagem Tipos de Variáveis esta no link: Parte 1

           

          Variável LOB  (Large Objects)


          As variáveis do tipo Large objects como o proprio nome sugere possibilitam o armazenamento de grandes informações como imagens, sons, vídeos, arquivos de texto e pdf. Esse tipo de variavel é dividido em 4 subtipos (datatypes): BFILE, BLOB, CLOB e NCLOB

          BFILE

          Serve apenas para leitura pois armazena tipos de dados binários localizados fora do banco de dados em arquivos do sistema operacional como TXT e HTML. Essa variável  deve ser declarada com referencia nula.

          Exemplo de declaração da variavel BFILE:


          V_TESTE BFILE;


            BLOB

            A varialvel do tipo BLOB aceita o armazenamento de dados binários de tamanho variável, esse datatype possibilita a leitura e a escrita. É possível especificar o tamanho 8 e 32 terabites. Se o tamanho não for definido será igual a 1 byte.
            A escrita e leitura da variável BLOB só pode ser feita dentro de uma transação (bloco anônimo ou nomeada),  utilizando  o pacote DBMS_LOB.

            A declaração da variável BLOB pode ser feita de 3 formas:
            • V_TESTE BLOB; -- variável BLOB nula
            • V_TESTE BLOB := empty_blob(); -- variável BLOB vazia
            • V_TESTE BLOB := '43'||'41'||'52'; --variável BLOB hexadecimal igual a" CAR"
            Esse tipo de variável é utilizada principalmente para o armazenamento de imagens grandes ou de filmes.


            CLOB

            Aceita o armazenamento de dados alfanuméricos,  podendo alocar entre 8 e 32 terabites de memoria.
            A variável CLOB aceita escrita e leitura porem isso só pode ser feito dentro de uma transação (bloco anônimo ou nomeada), para realizar a leitura de uma coluna do tipo CLOB é preciso utilizar o pacote DBMS_LOB. 

            A declaração da variável CLOB pode ser feita de 3 formas:


            • V_TESTE CLOB; -- variável CLOB nula
            • V_TESTE CLOB := empty_clob(); -- variável CLOB vazia
            • V_TESTE CLOB := 'CAR'; --variável CLOB igual a" CAR"



            NCLOB


            São tipos de dados alfanuméricos, podendo armazenar caracteres unicodes alocando entre  8 e 2 terabites de memoria.

            A variável NCLOB aceita escrita e leitura porem isso só pode ser feito dentro de uma transação (bloco anônimo ou nomeada), para realizar a leitura de uma coluna do tipo NCLOB é preciso utilizar o pacote DBMS_LOB é recomendável que a leitura ou o armazenamento das variáveis do tipo NCLOB seja realizada em partes caso o contrario pode-se sobrecarregar o sistema. 

            A declaração da variável NCLOB pode ser feita de 3 formas:

            • V_TESTE NCLOB; -- variável CLOB nula
            • V_TESTE NCLOB := empty_clob(); -- variável CLOB vazia
            • V_TESTE NCLOB := 'CAR'; --variável CLOB igual a" CAR"
            Esse tipo de variável é muito utilizado para o armazenamento de grandes textos.

            Variável Composta


            Uma variável do tipo composta contém uma ou mais variáveis, são formadas por uma ou mais posições (campos ou entradas). Podemos entender este tipo de variável como uma “estrutura” de armazenamento ou matriz. Podem ser registros, tabelas e VARRAYS. Existem dois grupos de datatypes Record and Colectoins (Gravações e Coleções)

            RECORD

            É um conjunto de elementos semelhantes que podem ser variáveis escalares ( Tipos de Variáveis – Parte 1), é uma estrutura que contem uma lista de variáveis. A definição do tipo de dados de uma variável RECORD pode ser implícita ou explicita.
            A declaração do tipo RECORD por der feita da seguinte forma:
            Declarar um tipo RECORD para agrupar dados

            TYPE nome_tipo IS RECORD (campo[, campo]...);

            Pode-se herdar a definição de um registo utilizando o comando %TYPE, desta forma ao referenciar o campo de uma tabela sua variável será do mesmo tipo que o campo.

            A definição de variáveis utilizando %TYPE simplifica a manutenção e reduz os impactos de 
            uma atualização, pois caso o campo da tabela seja alterado essa  alteração será transparente a todas as variáveis que estão declaradas em procedimentos internos ou externos com este atributo.


            DECLARE
                  registo_teste    T_TABELA.C_COLUNA%TYPE;
            BEGIN
               SELECT C_COLUNA INTO registo_teste 
                        FROM T_TABELA WHERE rownum < 2;

            END;

            COLLECTIONS


            Collections podem ser listas ou arrys, a diferença entre elas é que uma array possui um indexador numerado em sequência.
            As variáveis COLLECTIONS podem ser divididas em 3 subtipos (datatypes): VARRAY, Tabela aninhada  e Array Associativa


            VARRAY


            A collection do tipo VARRAY deve ser usada quando souber o tamanho máximo que a coleção vai ter antes da declaração, pois essa variável não pode aumentar de tamanho apos ser declarada. A VARRAY é um tipo de objeto e requer construção explicita, pode ficar em 3 estados: definida, inicializada e alocada.
            A criação do type VARRAY pode ser feita de duas formas em SQL utilizando o comando DDL, CREATE, ou em Bloco de execução na parte do DECLARE apenas declarando o type deve ser feita da seguinte forma:
            • Comando SQL

                           CREATE or REPLACE TYPE ty_varry_teste as VARRAY(10) of NUMBER; 
            • Declaração PL/SQL (bloco de execução)

                         TYPE ty_varry_teste is VARRAY(10) of NUMBER; 


            Os exemplos acima criam o type ty_varray_teste do tipo escalar NUMBER com 10 posições é possível utilizar qualquer tipo de variável escalar na criação do type. A diferença entre criar um type com comando SQL e com comando PL/SQL é que o segundo o type vai existir apenas em tempo de execução enquanto na primeira o type será criado fisicamente no seu banco de forma que qualquer bloco ou procedimento poderá utilizar o type.

            A variável do tipo type ty_varray_teste pode ser declarada de 3 formas como mencionei acima:
            • V_TESTE ty_varray_teste; -- variável definida
            • V_TESTE ty_varray_teste := ty_varray_teste(); --inicializada porem vazia
            • V_TESTE ty_varray_teste :=ty_varray_teste(1,2,3,4,5,null,7,8,9,10); --variável alocada
            é possível alocar o espaço de uma variável do tipo VARRAY com NULL, a não ser que na criação do type seja definido como "NOT NULL" como na criação abaixo:

            CREATE or REPLACE TYPE ty_varry_teste as VARRAY(10) of NUMBER NOT NULL; 

            Tabela aninhada

            Uma Tabela aninhada deve ser usada quando não souber o tamanho máximo que a coleção vai ter antes de declarar a variável, pois ela pode crescer apos a declaração.
            Assim como a VARRAY a tabela aninhada o type pode ser declarado de duas formas em SQL utilizando o comando DDL, CREATE, ou em Bloco de execução na parte do DECLARE apenas declarando o type deve ser feita da seguinte forma:
            • Comando SQL

                           CREATE or REPLACE TYPE ty_tabela_teste as TABLE of NUMBER; 
            • Declaração PL/SQL (bloco de execução)

                         TYPE ty_tabela_teste is TABLE of NUMBER; 

            Os exemplos acima criam o type ty_tabela_teste do tipo escalar NUMBER sem limite de posições é possível utilizar qualquer tipo de variável escalar na criação do type. A diferença entre criar um type com comando SQL e com comando PL/SQL é que o segundo o type vai existir apenas em tempo de execução enquanto na primeira o type será criado fisicamente no seu banco de forma que qualquer bloco ou procedimento poderá utilizar o type. Uma variável do tipo type ty_tabela_teste  pode ser declarada de 3 formas:
            • V_TESTE ty_tabela_teste; -- variável definida
            • V_TESTE ty_tabela_teste := ty_tabela_teste(); --inicializada porem vazia
            • V_TESTE ty_tabela_teste := ty_tabela_teste(1,2,3,4,5,null,7,8,9,10); --variável alocada
            Array Associativa

            É um conjunto de pares de chave e valor, com index povoado esparsamente .Só pode ser declarado no PL/SQL sua declaração pode ser feita da seguinte forma:
            • TYPE tabela_teste is TABLE of NUMBER INDEX BY PLS_INTEGER;
            A declaração de uma variável do tipo tabela_teste deve ser feita da seguinte forma:
            • V_TESTE tabela_teste;
            é importante destacar que a declaração do TYPE não limita o tamanho maximo da variável uma vez que ela pode crescer apos sua declaração, e o INDEX não é sequencial e pode ser definido como VARCHAR. 

            Uma vantagem de utilizar a Array Associativa é que ao deletar uma elemento da array o espaço de memoria que estava alocado é liberado.

            Variável Referência (apontador)

            Variáveis de referencia são mais conhecidas como cursores, são utilizadas para ajuste de resultados de querys em tempo de processamento, podem ser usados apenas pela linguagem PL/SQL em blocos nomeados ou não. Desta forma sua declaração e seus valores são perdidos no termino da execução.
            Eles podem ser implementados forte ou fracamente tipados.

            • TYPE cursos_teste is REF CURSOR RETURN PRLP.tprlcadmat0%ROWTYPE; --Cursor fortemente tipado
            • TYPE cursos_teste is REF CURSOR; --cursos fracamente tipado


            Esses são os tipos de variáveis aceitos pelo PL/SQL, mais pra frente vou falar sobre como trabalhar com com os datatype e como fazer a conversão entre eles.

            Referencia: http://www.linhadecodigo.com.br/artigo/539/large-objects-para-oracle.aspx#ixzz2iTa5Zrlr

            sexta-feira, 18 de outubro de 2013

            Tipos de Variáveis – Parte 1

            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

            quarta-feira, 16 de outubro de 2013

            Introdução ao PL/SQL


            pl-sql-icon
            Nessa primeira postagem vou fazer uma breve explanação sobre o PL/SQL .
            Vou tratar alguns pontos básicos como:
            O que é?
            Sua Historia.
            Estrutura Básica.



            O que é?

            Acredito que boa parte dos programadores tem uma noção básica do que é, mas aqui vou fazer uma definição clara para quem esta apenas iniciando nesse mundo ou para aqueles que simplesmente se viram trabalhando com PL/SQL.
            PL/SQL - Procedural Language/Structured Query Language - é a linguagem própria de programação do SGBD (Sistema de Gerenciamento de Banco de Dados) Oracle, é uma ferramenta robusta, podendo ser utilizada de várias formas para tratamento de dados no banco de dados.
            A linguagem PL/SQL pode simplificar o desenvolvimento de uma aplicação, otimizar a execução  e melhorar a execução de recursos de banco de dados, é uma linguagem case-insensitive (reconhece o comando independente se ele foi escrito em letras MAIUSCULAS ou em letras minúsculas)e aceita tipos de dados dinâmicos.

            Sua História

            A linguagem PL/SQL foi desenvolvida pela Oracle Corporation no começo dos anos 90. Antes disso a única forma de usar construções procedurais com o SQL era usar o PRO*C. O código C era pré-compilado para converter as instruções SQL em chamadas de bibliotecas.
            A primeira versão era muito limitada e só a partir da segunda versão que a PL/SQL passou a suportar procedures, tabelas PL/SQL, registros definidos pelo programador e package extensions.
            A versão 2.1 permitiu o uso de stored functions dentro de instruções SQL e com o surgimento do pacote DBMS_SQL foi possível  a criação de SQLs dinâmicos dentro de procedures.
            O agendamento de execuções só foi possível na versão 2.2 da PL/SQL  com o pacote DBMS_JOB. Também nessa versão foi implementado uma proteção ao código para programas PL/SQL. Apenas na versão 2.4 foram incluídos os Large Objects.
            Nas primeiras versões o da PL/SQL não seguia a numeração do banco de dados isso passou a ocorrer apenas na versão 8 do Oracle.
            Meu objetivo aqui não é detalhar cada versão apenas quis apresentar alguns momentos importantes na evolução da linguagem.

            Estrutura Básica

            A estrutura básica para um bloco anônimo é
            BEGIN
               /*Sequência de comandos*/
                NULL;
            END;

            Essa estrutura é a mais básica que o bloco PL pode ter aqui você pode realizar comandos simples de PL/SQL, o símbolo “/*” representa inicio de comentário e o “*/” encerra comentários. O comando “NULL” é apenas para que o bloco execute sem erros porem esse bloco não faz nada.

            O bloco mais complexo pode seguir a estrutura a baixo:

            [Declare]

              /*Declaração de variáveis*/
            BEGIN

              /*Sequência de comandos*/
              NULL;

              [Exception]
              /*Tratamento de erros*/
              NULL;

            END;

            O [Declare] possibilita a declaração de variáveis que serão usadas no corpo do bloco de execução, o excepton permite a realização de tratamentos de erros para que eles simplesmente não parem toda a execução.



            Referência:
            Livro: PL/SQL Programação do Michel MCLaughlin

            Mais PL/SQL

            O Blog


            Esse blog foi criado com o objetivo de ajudar quem esta iniciando os estudos em banco de dados, SQL e ou PL/SQL ou para que já conhece e quer evoluir mais.
            Vou postar artigos com dicas de como programar, como otimizar seu código e como usar o banco Oracle.
            Teremos artigos do conhecimento básico ao avançado.

            A blogueira


            Formada em Informatica para Gestão de Negócios pela Fatec ( Faculdade de tecnologia do estado de São Paulo). Cursando especialização em banco de dados pela UNICAMP ( termino previsto dezembro 2016). Oito anos de  experiencia em TI sendo 7 dedicados exclusivamente a banco de dados.

            Qualquer duvida, insegurança ou questionamento pode comentar em qualquer post do blog.