



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 |