Mostrando postagens com marcador Oracle. Mostrar todas as postagens
Mostrando postagens com marcador Oracle. Mostrar todas as postagens

quarta-feira, 16 de outubro de 2013

Oracle com XML? Sim veja como...

Fazendo umas pesquisas necessitei usar XML com Oracle, para compartilhar com os amigos segue a minha brincadeira, que coloco as duas formas mais comuns com elementos e com atributos:
SELECT XMLElement("Tempo"
        ,XMLAttributes(to_char(current_date,'dd/mm/yyyy') AS "Data",
                       to_char(current_date,'hh24:mi:ss') AS "Hora")
        , XMLElement("Dia",to_char(current_date,'dd'))
        , XMLElement("Mes",to_char(current_date,'mm'))
        , XMLElement("Ano",to_char(current_date,'yyyy'))
        , XMLElement("Horas",to_char(current_date,'hh24'))
        , XMLElement("Minutos",to_char(current_date,'mi'))
        , XMLElement("Segundos",to_char(current_date,'ss'))
       ) AS "XML_RESULT" FROM DUAL

Resultado da brincadeira:

<Tempo Data="16/10/2013" Hora="19:28:53">
    <Dia>16</Dia>
    <Mes>10</Mes>
    <Ano>2013</Ano>
    <Horas>19</Horas>
    <Minutos>28</Minutos>
    <Segundos>53</Segundos>
</Tempo>

Espero que isso ajude alguém, abraços

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;