DICAS

Visite a biblioteca de dicas da comunidade.

Saiba mais

ARTIGOS

Abordagens detalhadas sobre assuntos diversos.

Saiba mais

INICIANTES

Aprenda a programar de um modo simples e fácil.

Saiba mais

DOWNLOADS

Acesse os materiais exclusivos aos membros.

Saiba mais
voltar

PARA QUEM GOSTA DE DELPHI

Stored procedure que remove acentos em firebird

Algumas vezes queremos fazer todos os tratamentos em consultas SQL,
e foi encontrado o seguinte problema:

Como remover os acentos de um campo varchar?

Felizmente encontrei uma stored procedure que resolve este problema!

Segundo sugestões de Ivan Cesar, segue mais exemplos de como montar a mesma
funcionalidade mas evitando possíveis problemas de charset.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
--Abaixo temos duas outras procedures com a mesma função e que 
--funcionam com bancos usando charset NONE, enviadas por Ivan Cesar
 
CREATE OR ALTER PROCEDURE REMOVE_ACCENTOS_FB15 (
    TEXTO VARCHAR(500))
RETURNS (
    RETORNO VARCHAR(500))
AS
DECLARE VARIABLE VL_ASCII SMALLINT;
BEGIN
  RETORNO = '';
  IF (STRLEN(:TEXTO) = 0) THEN
    EXIT;
  WHILE (STRLEN(:TEXTO) > 0) DO
  BEGIN
    VL_ASCII = ASCII_VAL(SUBSTRING(:TEXTO FROM 1 FOR 1));
    IF (:VL_ASCII IN (-4, -5, -6)) THEN
      VL_ASCII = 117;
    IF (:VL_ASCII IN (-11, -12, -13)) THEN
      VL_ASCII = 111;
    IF (:VL_ASCII = -19) THEN
      VL_ASCII = 105;
    IF (:VL_ASCII IN (-22, -23)) THEN
      VL_ASCII = 101;
    IF (:VL_ASCII = -25) THEN
      VL_ASCII = 99;
    IF (:VL_ASCII IN (-29, -30, -31, -32)) THEN
      VL_ASCII = 97;
    IF (:VL_ASCII IN (-36, -37, -38)) THEN
      VL_ASCII = 85;
    IF (:VL_ASCII IN (-43, -44, -45)) THEN
      VL_ASCII = 79;
    IF (:VL_ASCII = -51) THEN
      VL_ASCII = 73;
    IF (:VL_ASCII IN (-54, -55)) THEN
      VL_ASCII = 69;
    IF (:VL_ASCII = -57) THEN
      VL_ASCII = 67;
    IF (:VL_ASCII IN (-61, -62, -63, -64)) THEN
      VL_ASCII = 65;
    RETORNO = :RETORNO || ASCII_CHAR(:VL_ASCII);
    TEXTO = SUBSTRING(:TEXTO FROM 2 FOR 500);
  END
  -- OPTEI POR UM RETORNO NULL
  IF (:RETORNO = '') THEN
    RETORNO = NULL;
  SUSPEND;
END
 
/*************************************************************
          PARA USO NO FIREBIRD 2.0 OU SUPERIORES
**************************************************************/
 
CREATE OR ALTER PROCEDURE REMOVE_ACCENTOS_FB2X (
    TEXTO VARCHAR(500))
RETURNS (
    RETORNO VARCHAR(500))
AS
DECLARE VARIABLE VL_ASCII SMALLINT;
DECLARE VARIABLE ILOOP SMALLINT = 1;
BEGIN
  RETORNO = '';
  WHILE (ILOOP <= CHAR_LENGTH(:TEXTO)) DO
  BEGIN
    VL_ASCII = ASCII_VAL(SUBSTRING(:TEXTO FROM :ILOOP FOR 1));
    IF (:VL_ASCII BETWEEN 192 AND 196) THEN
      VL_ASCII = 65;
    IF (:VL_ASCII = 199) THEN
      VL_ASCII = 67;
    IF (:VL_ASCII BETWEEN 200 AND 203) THEN
      VL_ASCII = 69;
    IF (:VL_ASCII BETWEEN 204 AND 207) THEN
      VL_ASCII = 73;
    IF (:VL_ASCII = 209) THEN
      VL_ASCII = 78;
    IF (:VL_ASCII BETWEEN 210 AND 214) THEN
      VL_ASCII = 79;
    IF (:VL_ASCII BETWEEN 217 AND 220) THEN
      VL_ASCII = 85;
    IF (:VL_ASCII BETWEEN 224 AND 228) THEN
      VL_ASCII = 97;
    IF (:VL_ASCII = 231) THEN
      VL_ASCII = 99;
    IF (:VL_ASCII BETWEEN 232 AND 235) THEN
      VL_ASCII = 101;
    IF (:VL_ASCII BETWEEN 236 AND 239) THEN
      VL_ASCII = 105;
    IF (:VL_ASCII = 241) THEN
      VL_ASCII = 110;
    IF (:VL_ASCII BETWEEN 242 AND 246) THEN
      VL_ASCII = 111;
    IF (:VL_ASCII BETWEEN 249 AND 252) THEN
      VL_ASCII = 117;
    RETORNO = :RETORNO || ASCII_CHAR(:VL_ASCII);
    ILOOP = :ILOOP + 1;
  END
  -- OPTEI POR UM RETORNO NULL
  IF (:RETORNO = '') THEN
    RETORNO = NULL;
  SUSPEND;
END

Veja um exemplo de uso:

1
2
3
SELECT
u.retorno
FROM REMOVE_ACCENTOS_FB2X('Atenção, está funcionando!') u
Facebook Comments Box
  • Giovani Da Cruz
  • 7.574 views
  • 0 comentários
  • 12 de fevereiro de 2017

Está gostando do conteúdo? Considere pagar um cafezinho para nossa equipe!

Deixe um comentário

Ir ao topo

© 2024 Infus Soluções em Tecnologia - Todos os Direitos Reservados