quarta-feira, 17 de abril de 2013

Oracle - PL-SQL - Comandos (Cursores)

Apresento como trabalhar com Cursores no Oracle


Exemplo cursor LOOP Simples


SET SERVEROUTPUT ON
DECLARE CURSOR cur IS  SELECT * FROM tb_tabela;
        linha cur%ROWTYPE;
BEGIN
    OPEN cur;
    LOOP
        FETCH cur INTO linha;
        EXIT WHEN cur%NOTFOUND;       
        /* 
           comandos
           DBMS_OUTPUT.PUT_LINE(linha.campo_tabela);
        */
    END LOOP;
    CLOSE cur;
END;


Exemplo cursor LOOP WHILE


SET SERVEROUTPUT ON
DECLARE CURSOR cur IS SELECT * FROM tb_tabela;       
        linha cur%ROWTYPE;
BEGIN
    OPEN cur;
    FETCH cur INTO linha;
    WHILE cur%FOUND LOOP      
        /* 
           comandos
           DBMS_OUTPUT.PUT_LINE(linha.campo_tabela);
        */
        FETCH cur INTO linha;    
    END LOOP;
    CLOSE cur;
END;


Exemplo cursor LOOP FOR


SET SERVEROUTPUT ON
DECLARE CURSOR cur IS  SELECT * FROM tb_tabela;       
BEGIN
    FOR linha IN cur LOOP
        /* 
           comandos
           DBMS_OUTPUT.PUT_LINE(linha.campo_tabela);
        */
    END LOOP;
END;


Exemplo cursor LOOP FOR IMPLICITO


SET SERVEROUTPUT ON
BEGIN
    FOR linha IN (SELECT * FROM tb_tabela) LOOP
        /* 
           comandos
           DBMS_OUTPUT.PUT_LINE(linha.campo_tabela);
        */
    END LOOP;
END;


Exemplo cursor LOOP FOR (FOR UPDATE)


DECLARE CURSOR cur SELECT * FROM tb_tabela FOR UPDATE;
             variavel NUMBER;
BEGIN
    variavel := 1.0;
    FOR linha IN cur LOOP
        IF linha.campo_media >7 THEN
            variavel := 1.5;
        END IF;

        UPDATE tb_tabela
           SET campo_tabela = variavel
         WHERE CURRENT OF cur;
    END LOOP;
END;


cur%ISOPEN --- VERIFICANDO CURSOR ABERTO


DECLARE CURSOR cur SELECT * FROM tb_tabela 
IF cur%ISOPEN THEN
 CLOSE cur;
END IF;
OPEN cur;


SQL%FOUND oposto SQL%NOTFOUND


SET SERVEROUTPUT ON
DELETE FROM tb_tabela WHERE condicao_verdadeira;
 
IF SQL%FOUND THEN  -- Sucesso na Cláusula DELETE
       DBMS_OUTPUT.PUT_LINE( 'Linhas afetadas na instrução DELETE: '|| TO_CHAR(SQL%ROWCOUNT));
END IF;


tb_tabela.campo_tabela%TYPE
Declarando variável do mesmo tipo de uma coluna de uma tabela



DECLARE variavelCampo tb_tabela.campo_tabela%TYPE; 


tb_tabela%ROWTYPE
Declarando uma variável com estrutura de uma tupla de uma tabela



DECLARE linha tb_tabela%ROWTYPE; 


Criando um Tipo de dados


DECLARE 
    TYPE novoTipo IS TABLE OF tb_tabela.campo_tabela%TYPE;
    variavelNovoTipo  novoTipo;
    CURSOR cur IS  
        SELECT campo_tabela
          FROM tb_tabela 
         WHERE condicao_verdadeira;

BEGIN
    OPEN cur;
    FETCH cur BULK COLLECT INTO variavelNovoTipo;
    CLOSE cur;

    FOR i IN variavelNovoTipo.FIRST .. variavelNovoTipo.LAST 
    LOOP
        DBMS_OUTPUT.PUT_LINE( variavelNovoTipo(i) );
    END LOOP;
END;  

Oracle - PL-SQL - Comandos (Laços)

Abaixo os Laços possíveis que podemos usar no Oracle


LOOP FINITO CONDICIONAL


LOOP
    /*
        comandos
    */
    EXIT WHEN condicao_verdadeira
END LOOP;

LOOP FOR N VEZES


FOR i IN 1..N LOOP
    /*
        comandos
        quando i for igual a N sai do loop
    */    
END LOOP;

LOOP FOR N VEZES INVERTIDO


FOR i IN REVERSE 1..N LOOP
    /*
        comandos
        quando i for igual a 1 sai do loop
    */    
END LOOP;

LOOP WHILE CONDICIONAL


DECLARE i NUMBER := 0;
DECLARE n NUMBER := 10;
WHILE i < n LOOP
    /*
        comandos
        quando i for igual a 'n' sai do loop
    */    
    i := i + 1;
END LOOP;

segunda-feira, 15 de abril de 2013

Javascript: Validar Data no Formato DD/MM/YYYY

Sempre que ao pesquisar sobre uma validação de data encontrava muito código para pouco resultado, e após algum estudo resolvi criar uma validação feita por mim, utilizei um conceito muito simples: se após converter o valor para o tipo Data e após a conversão a data ainda for a mesma, quer dizer que a conversão foi um sucesso, então sabemos que a data é válida.


//-----------------------------------------------------------------
// Entrada DD/MM/AAAA
//-----------------------------------------------------------------
function fctValidaData(obj)
{
    var data = obj.value;
    var dia = data.substring(0,2)
    var mes = data.substring(3,5)
    var ano = data.substring(6,10)

    //Criando um objeto Date usando os valores ano, mes e dia.
    var novaData = new Date(ano,(mes-1),dia);

    var mesmoDia = parseInt(dia,10) == parseInt(novaData.getDate());
    var mesmoMes = parseInt(mes,10) == parseInt(novaData.getMonth())+1;
    var mesmoAno = parseInt(ano) == parseInt(novaData.getFullYear());

    if (!((mesmoDia) && (mesmoMes) && (mesmoAno)))
    {
        alert('Data informada é inválida!');   
        obj.focus();    
        return false;
    }  
    return true;
}

Segue abaixo um exemplo de como utilizar a function:


<body>

Data: 
<input type='text' id='txtDt' name='txtDt' onblur='fctValidaData(this);'/>

</body>

domingo, 14 de abril de 2013

Por que um Datawarehouse?

A pedido do meu amigo Serginho [Sheep] estou escrevendo este post sobre Datawarehouse.

Este post não tem o foco de dizer como construir um Datawarehouse mas dizer o que é e para que serve. Então vou contar uma historinha.....(risos)


Datawarehouse como o próprio nome diz, do inglês "Armazém de Dados" é um repositório que contém dados para finalidades exclusivas de análise de dados para facilitar em tomadas de decisões em um ambiente corporativo, também conhecido pelas siglas DW, DWH ou EDW (Enterprise Datawarehouse).

Em grandes ambientes corporativos que tem um sistema de informação bem definido, (nos moldes tradicionais, dentro dele possui relatórios de finalidade de gerenciamento), muitas vezes seus relatórios não são suficientemente ideais para que diretores realize a tomada de decisões na empresa em que trabalha, e nestes sistemas quando criados, podemos considerar que um relatório não "nasce" com o sistema, pois, são de tempos em tempos solicitados pelos diretores.

Pensando que a cada dia um novo relatório "nasce", e que um relatório quando solicitado, pode levar horas ou até mesmo dias para ser visualizado pelo gestor, além de possuir um custo por passar por um processo de desenvolvimento, surgiu a necessidade de uma solução que permitisse aos diretores e gestores uma tomada de decisão mais ágil e evitar esse tempo "perdido" até ter a informação, assim surgiu o Datawarehouse.

Um DW é um banco de dados que deve ser construído de maneira que facilite a visualização de dados cruzados, o mesmo normalmente é "alimentado" por meio de dados já persistidos em outro banco de dados (normalmente um relacional). Não devemos pensar que o mesmo será a solução para todos os relatórios possíveis do sistema, suas possibilidades são permitidas conforme uma análise da necessidade e essência do sistema, um trabalho conjunto entre Administradores de Banco de Dados e Analistas de Sistemas pode ser importante para definir bem o foco das possíveis necessidades do cliente, porém o responsável por construir e definir as regras para criação do Datawarehouse é o DBA (DataBase Administrator).

O mais importante é saber que o DW não veio para substituir todos os relatórios de um sistema, em um DW serão armazenadas apenas informações históricas, são dados que não podem sofrer alterações, pois normalmente os gestores tomam decisões com base em informações passadas, então como exemplo: pode se adotar que no sistema serão visíveis dados apenas de até 1 anos atraz, sendo os demais anos anteriores os dados visiveis apenas em um DW.
Exitem ferramentas gerenciais de BI (Business Inteligence) que permitem o acesso de maneira eficiente de um DW.