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:


3 comentários:

  1. Alisson, blz?
    Consegueria passar essa função para SQL Server?
    Por ex: A função LENGTH to SQL = LEN
    INSTR seria = ?

    ResponderExcluir
    Respostas
    1. Estou nessa situação, onde tenho que fazer uma Query em SQL server, onde a cada resultado de Nome, ele me traga todas as iniciais deste nome.
      Ex: Luiz Almeida Candido
      R: Luiz A. C.

      Ex: Carlos Ferreira de Almeida Costa
      R: Carlos F. A. C.

      Entendeu?
      Tentei vários tipos de soluções da internet, mas nenhume que me ajudasse com esse resultado. Desde já agradeço.

      Excluir
    2. Consegui encontrar a função. Grato. Caso alguém precise, compartilho:

      -------------------FUNÇÃO ABREVIAR NOMES ----------------------------
      CREATE FUNCTION dbo.f_abreviar_nome(@value VARCHAR(MAX)) RETURNS VARCHAR(MAX)
      AS BEGIN
      DECLARE @firstName VARCHAR(50);
      DECLARE @middleName VARCHAR(MAX);
      DECLARE @aux VARCHAR(50);
      DECLARE @fullName VARCHAR(50);
      SET @firstName = LEFT(@value, CHARINDEX(' ', @value));
      SET @middleName = '';
      SET @aux = LTRIM(REPLACE(@value, @firstName,''));

      SET @aux = LTRIM(REPLACE(@aux, 'da ',' '));
      SET @aux = LTRIM(REPLACE(@aux, 'das ',' '));
      SET @aux = LTRIM(REPLACE(@aux, 'de ',' '));
      SET @aux = LTRIM(REPLACE(@aux, 'do ',' '));
      SET @aux = LTRIM(REPLACE(@aux, 'dos ',' '));

      WHILE (LEN(@aux) > 0)
      BEGIN
      SET @aux = LTRIM(@aux);
      SET @middleName = @middleName + SUBSTRING(@aux, 1,1) + '. ';
      IF (CHARINDEX(' ', @aux) > 0)
      SET @aux = REPLACE(@aux, LEFT(@aux, CHARINDEX(' ', @aux)), '');
      ELSE
      SET @aux = '';
      END
      SET @fullName = @firstName + @middleName;
      RETURN ( @fullName );
      END
      GO

      -------------------FUNÇÃO ABREVIAR NOMES ---------------------------

      Uso:

      SELECT dbo.f_abreviar_nome (CAMPO), NOME * FROM TABELA

      Excluir