quinta-feira, 19 de novembro de 2009

Case x Decode

Decode
 SELECT
  DECODE  (
    vCargo,
    1, ‘Presidente’,
    2, ‘Diretor’,
    3, ‘Gerente’,
       ‘Funcionário’
  )
FROM dual;

Case Simples
 SELECT
  CASE
    vCargo
    WHEN 1
      THEN ‘Presidente’
    WHEN 2
      THEN ‘Diretor’
    WHEN 3
      THEN ‘Gerente’
    ELSE   ‘Funcionário’
  END
FROM dual;

Case com Pesquisa
SELECT
  CASE
    WHEN vCargo = 1
      THEN ‘Presidente’
    WHEN vCargo = 2
      THEN ‘Diretor’
    WHEN vCargo = 3
      THEN ‘Gerente’
    ELSE ‘Funcionário’
  END
FROM dual;

Case x Decode, Quem vence?
Implementado na versão Oracle 8.1.6, o Case é o melhor. Ele é mais flexível, tem uma melhor performance de execução, é mais fácil para leitura e escrita e conseqüentemente é mais fácil de eliminar erros e manter uma codificação mais elegante.

Execute Immediate para funções

DECLARE
  plsql_block VARCHAR2(2000);
BEGIN
  --montando a string sql
  plsql_block := 'BEGIN atualiza_flag(:Codigo, :snimpressao, :dtimpressao); END;';
  --executando a string que contem plsql_block
  EXECUTE IMMEDIATE plsql_block USING 5, 'S', SYSDATE;
  --agora, mostrando que também é possível executar a rotina sem a necessidade de usar a variavel plsql_block
  EXECUTE IMMEDIATE 'BEGIN atualiza_flag(:Codigo, :snimpressao, :dtimpressao);' USING 112, 'S', SYSDATE;
END;

Criando Tablespace

create tablespace spedf_dad
datafile 'E:\Oracle\oradata\synctst\spedf_dad.dbf' size 10M reuse
autoextend on next 10M maxsize 300M
default storage (initial 512K next 256K
minextents 1
maxextents unlimited
pctincrease 0)
online;

quarta-feira, 18 de novembro de 2009

Tranformando colunas em linhas

CREATE OR REPLACE FUNCTION col_to_row (p_select  IN VARCHAR2,
                                       p_dlmtr IN VARCHAR2 DEFAULT ',' )
RETURN VARCHAR2

/*AUTHID CURRENT_USER --Somente o usuário que criou pode executar*/
AS
TYPE c_refcur IS REF CURSOR;
c_dummy   c_refcur;

lc_str    VARCHAR2(4000);
lc_colval VARCHAR2(4000);

BEGIN
    OPEN c_dummy FOR p_select;

    LOOP
        FETCH c_dummy INTO lc_colval;
        EXIT WHEN c_dummy%NOTFOUND;
        lc_str := lc_str || p_dlmtr || lc_colval;
    END LOOP;

    CLOSE c_dummy;

    RETURN SUBSTR(lc_str,2);
END;

--Executando
SELECT COL_TO_ROW(‘SELECT COL1 FROM TABELA’) FROM DUAL