Eu escrevi uma função ORACLE PL-SQL para converter uma string de camelCase para snake_case usando REGEXP_REPLACE. Abaixo está a função em si:
create function camel_to_snake(str varchar2) return varchar2 as
begin
return
lower(
regexp_replace(
regexp_replace (
str,
'([A-Z])([A-Z][a-z])',
'\1_\2',
1, 0, 'c'
),
'([a-z])([A-Z])',
'\1_\2',
1, 0, 'c'
)
);
end;
E depois de algum tempo descobriu-se que o resultado da função depende do parâmetro do lado do cliente NLS_LANG.
Para que a função funcione corretamente, o idioma e o território devem ser especificados - AMERICAN_AMERICA
select
column_value as camel_case,
camel_to_snake(column_value) as snake_case
from
table(t_varchar_table(
'Foo',
'FooBar',
'foobar'
));
CAMEL_CASE SNAKE_CASE
---------------------------------------- ----------------------------------------
Foo foo
FooBar foo_bar
foobar foobar
Caso contrário, ele retorna um absurdo (idiomas cirílicos):
select
column_value as camel_case,
camel_to_snake(column_value) as snake_case
from
table(t_varchar_table(
'Foo',
'FooBar',
'foobar'
));
CAMEL_CASE SNAKE_CASE
---------------------------------------- ----------------------------------------
Foo f_o_o
FooBar f_o_ob_a_r
foobar f_o_ob_a_r
Como corrigir isso para que o resultado da função não dependa dos parâmetros do cliente?
Intervalos de caracteres como
[A-Z]
são dependentes do idioma. Você pode usar classes de caracteres como[[:upper:]]
em vez disso:violino