quinta-feira, 12 de setembro de 2013

Identificando a base dados em uma rotina PL/SQL

Olá Galera!

Quem já não teve situações de ter criado rotinas no Oracle para executar um determinado procedimento, porém quando você sobe uma base de Homologação essas rotinas são executadas sem necessidade? Pois é, tive esse problema com uma rotina de envio de e-mail, onde era enviado e-mail para um grupo de pessoas toda vez que a rotina era executada durante a realização de testes em base de Homologação.

Para resolver o problema foi simples, existe a view v$databasenativa do Oracle , onde na coluna name retorna o nome do banco de dados.

Para facilitar a validação da base de dados, criei um function onde eu a implementei no inicio da minha rotina.

Abaixo segue o script para criação da function e um exemplo de como pode ser feito a validação para execução da rotina criada na base de dados desejada.

Script Function:


Exemplo da validação:

Sei que muitos devem achar muito besta o que postei, mais hoje é um dos cuidados que tenho sempre que vou desenvolver uma nova rotina, assim não precisando toda vez ficar desabilitando a rotina ou jobs no Oracle.

Obrigado!


quarta-feira, 4 de setembro de 2013

Function Oracle para retornar as iniciais de um nome

Olá Galera, esses dias tive a necessidade de criar uma function no Oracle que me retornasse as iniciais de um nome, não cheguei a pesquisar para saber se já existia algo parecido e também não sei se o jeito que fiz é realmente o jeito mais fácil, porem achei que ficou bem simples!!


CREATE OR REPLACE FUNCTION OBTER_INICIAIS(P_NOME VARCHAR2)
RETURN VARCHAR2
IS
W_QT_INICIAIS NUMBER(2);
W_POSICAO NUMBER(2);
W_INICIAIS VARCHAR2(10);
BEGIN

W_QT_INICIAIS := LENGTH(P_NOME) - LENGTH(REPLACE(P_NOME,' ',''));
W_INICIAIS := SUBSTR(P_NOME,1,1);
W_POSICAO := 1;

WHILE W_QT_INICIAIS >= W_POSICAO
  LOOP      
    W_INICIAIS := W_INICIAIS||SUBSTR(P_NOME,INSTR(P_NOME,' ',1,W_POSICAO)+1,1);
    W_POSICAO := W_POSICAO +1;                
  END LOOP;


RETURN UPPER(W_INICIAIS);

END;
/

Explicando alguns trechos do código:

1) Identifico a quantidade de espaços existentes no nome, sendo a Quantidade de Caracteres menos(-) a quantidade de caracteres sem os espaços:


W_QT_INICIAIS := LENGTH(P_NOME) - LENGTH(REPLACE(P_NOME,' ',''));


2) Atribui na variável a primeira letra do nome como sendo a minha primeira inicial:


W_INICIAIS := SUBSTR(P_NOME,1,1);


3) Identifico a próxima letra inicial do nome. Nesse caso utilizei duas Funções nativa do Oracle, a função INSTR(Utilizei para identificar a posição dos espaços em branco) e SUBSTR(Utilizei para selecionar o próximo caracter após o espaço em branco):


 W_INICIAIS := W_INICIAIS||SUBSTR(P_NOME,INSTR(P_NOME,' ',1,W_POSICAO)+1,1);


Testando a function: