Colegas, Acho que descobri o que deve ser o motivo do problema: NLS_LANGUAGE diferentes nas sessions
Vejam abaixo: SQL> SELECT * FROM V$NLS_PARAMETERS; PARAMETER VALUE ---------------------------------------------------------------- ---------------------------------------------------------------- NLS_LANGUAGE BRAZILIAN PORTUGUESE NLS_TERRITORY BRAZIL NLS_CURRENCY R$ NLS_ISO_CURRENCY BRAZIL NLS_NUMERIC_CHARACTERS ., NLS_CALENDAR GREGORIAN NLS_DATE_FORMAT DD-MON-RR NLS_DATE_LANGUAGE BRAZILIAN PORTUGUESE NLS_CHARACTERSET WE8ISO8859P1 NLS_SORT WEST_EUROPEAN NLS_TIME_FORMAT HH24:MI:SSXFF NLS_TIMESTAMP_FORMAT DD/MM/RR HH24:MI:SSXFF NLS_TIME_TZ_FORMAT HH24:MI:SSXFF TZR NLS_TIMESTAMP_TZ_FORMAT DD/MM/RR HH24:MI:SSXFF TZR NLS_DUAL_CURRENCY Cr$ NLS_NCHAR_CHARACTERSET AL16UTF16 NLS_COMP BINARY NLS_LENGTH_SEMANTICS BYTE NLS_NCHAR_CONV_EXCP FALSE 19 linhas selecionadas. SQL> ALTER SESSION SET NLS_LANGUAGE = 'BRAZILIAN PORTUGUESE'; Sessão alterada. SQL> Declare 2 nResult Number; 3 Begin 4 Begin 5 Select 1 6 Into nResult 7 From dual 8 Where REGEXP_LIKE ( 'lilian.leite@autoação2000.com.br','^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$'); 9 Exception 10 When Others Then 11 nResult := 0; 12 End; 13 Dbms_Output.Put_Line('nResult='||nResult); 14 End; 15 / nResult=1 Procedimento PL/SQL concluído com sucesso. SQL> ALTER SESSION SET NLS_LANGUAGE = 'AMERICAN'; Session altered. SQL> Declare 2 nResult Number; 3 Begin 4 Begin 5 Select 1 6 Into nResult 7 From dual 8 Where REGEXP_LIKE ( 'lilian.leite@autoação2000.com.br','^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$'); 9 Exception 10 When Others Then 11 nResult := 0; 12 End; 13 Dbms_Output.Put_Line('nResult='||nResult); 14 End; 15 / nResult=0 PL/SQL procedure successfully completed. Conclusão: Com o NLS_LANGUAGE = 'AMERICAN', os caracteres acentuados não são considerados no meu REGEXP_LIKE, que é o resultado que desejo. Já com o NLS_LANGUAGE = 'BRAZILIAN PORTUGUESE', os caracteres acentuados são considerados no REGEXP_LIKE e trazem um resultado indesejado. Pergunta: O bloco acima foi utilizado somente para demonstrar o problema. Na verdade, esse código está numa função compilada no banco. Existe alguma forma de fazer com que esse parâmetro seja desprezado, sendo considerado sempre a nível de banco e não de session ? Uma possibilidade seria incluir o "execute_immediate" abaixo na function. Já teste e funciona, mas gostaria de evitar fazer dessa forma se fosse possível: EXECUTE IMMEDIATE('ALTER SESSION SET NLS_LANGUAGE = "AMERICAN"'); É possível inclusive preservar o NLS_LANGUAGE original buscando-o na V$NLS_PARAMETERS e no final da function voltar a deixar como estava executando outro "EXECUTE IMMEDIATE" Aguardo sugestões e comentários dos colegas. Abs, Zilmar Furquim Synchro Systems