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 |
--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 |
select
u.retorno
from REMOVE_ACCENTOS_FB2X('Atenção, está funcionando!') u
-
Giovani Da Cruz
-
7.561 views
- 0 comentários
- 12 de fevereiro de 2017
Está gostando do conteúdo? Considere pagar um cafezinho para nossa equipe!
Posts Relacionados - Continue Aprendendo