No Oracle Database, existem alguns parâmetros NLS diferentes que determinam como a moeda é exibida ao usar funções como
TO_CHAR()
para formatar um número como moeda. NLS_CURRENCY
especifica a string a ser usada como o símbolo da moeda local para oL
elemento de formato de número.NLS_ISO_CURRENCY
determina o que usar para oC
elemento de formato.NLS_DUAL_CURRENCY
especifica o que usar para oU
elemento de formato.
O valor padrão para estes é determinado pelo
NLS_TERRITORY
parâmetro. Você pode alterar cada um desses parâmetros individualmente, se desejar, mas na maioria dos casos, é melhor alterar o
NLS_TERRITORY
parâmetro. Isso porque, fazer isso implicitamente altera todos os outros parâmetros de moeda para seus valores padrão para esse território. Retorne os valores atuais
Primeiro, vamos consultar os
V$NLS_PARAMETERS
view para descobrir quais são nossos valores padrão:SELECT
PARAMETER,
VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER IN (
'NLS_TERRITORY',
'NLS_CURRENCY',
'NLS_ISO_CURRENCY',
'NLS_DUAL_CURRENCY'
);
Resultado:
PARAMETER VALUE ____________________ ____________ NLS_TERRITORY AUSTRALIA NLS_CURRENCY $ NLS_ISO_CURRENCY AUSTRALIA NLS_DUAL_CURRENCY $
O território é a Austrália e todos os parâmetros de moeda usam os valores padrão para este território.
Alterar todos os símbolos de moeda
Vamos alterar o
NLS_TERRITORY
parâmetro para um novo valor:ALTER SESSION SET NLS_TERRITORY = 'Denmark';
Resultado:
Session altered.
Agora vamos verificar nossos parâmetros de moeda NLS novamente:
SELECT
PARAMETER,
VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER IN (
'NLS_TERRITORY',
'NLS_CURRENCY',
'NLS_ISO_CURRENCY',
'NLS_DUAL_CURRENCY'
);
Resultado:
PARAMETER VALUE ____________________ __________ NLS_TERRITORY DENMARK NLS_CURRENCY kr NLS_ISO_CURRENCY DENMARK NLS_DUAL_CURRENCY €
Em relação ao
NLS_ISO_CURRENCY
Embora isso determine qual símbolo monetário ISO usar, o símbolo monetário real não é retornado aqui. O exemplo a seguir ilustra o que quero dizer:
SELECT
TO_CHAR(45, 'L99') AS "L",
TO_CHAR(45, 'C99') AS "C",
TO_CHAR(45, 'U99') AS "U"
FROM DUAL;
Resultado:
L C U ________________ _____________ ______________ kr45 DKK45 €45
Portanto, mesmo que o
NLS_ISO_CURRENCY
parâmetro tem um valor de DENMARK
, o C
elemento de formato retornado DKK
, que é o símbolo monetário ISO real para a Dinamarca. Alterar os símbolos de moeda individualmente
Conforme mencionado, você pode definir explicitamente cada parâmetro NLS individualmente.
Por exemplo, tendo definido o território para a Dinamarca no exemplo anterior, agora podemos substituir qualquer (ou todos) os símbolos de moeda, definindo-os explicitamente:
ALTER SESSION SET NLS_CURRENCY = '$';
ALTER SESSION SET NLS_ISO_CURRENCY = 'AUSTRALIA';
ALTER SESSION SET NLS_DUAL_CURRENCY = '$';
Resultado:
Session altered. Session altered. Session altered.
Agora, aqui está o que obtemos ao executar o
SELECT
anterior demonstração:SELECT
TO_CHAR(45, 'L99') AS "L",
TO_CHAR(45, 'C99') AS "C",
TO_CHAR(45, 'U99') AS "U"
FROM DUAL;
Resultado:
L C U ________________ _____________ ________________ $45 AUD45 $45
Portanto, embora nosso território permaneça na Dinamarca, nossos símbolos de moeda refletem um território diferente (neste caso, a Austrália).
Uma coisa a ter em mente ao fazer isso é que você pode acabar em uma situação em que seus parâmetros de moeda não refletem outros parâmetros, como
NLS_NUMERIC_CHARACTERS
(que determina quais caracteres usar para o separador de grupo e o caractere decimal). Por exemplo:
SELECT
TO_CHAR(4599.60, 'L99G999D99') AS "L",
TO_CHAR(4599.60, 'C99G999D99') AS "C",
TO_CHAR(4599.60, 'U99G999D99') AS "U"
FROM DUAL;
Resultado:
L C U _______________________ ____________________ _______________________ $4.599,60 AUD4.599,60 $4.599,60
Neste caso, temos símbolos de moeda australiana, mas o separador de grupo é um ponto (
.
) e o caractere decimal é uma vírgula (,
), que não reflete as convenções australianas (reflete a convenção usada pela Dinamarca). A convenção australiana é o contrário – o separador de grupo é uma vírgula (,
) e o caractere decimal é um ponto (.
). Para ilustrar isso, eis o que obtemos se simplesmente redefinirmos o território para a Austrália e executarmos a instrução novamente:
ALTER SESSION SET NLS_TERRITORY = 'Australia';
SELECT
TO_CHAR(4599.60, 'L99G999D99') AS "L",
TO_CHAR(4599.60, 'C99G999D99') AS "C",
TO_CHAR(4599.60, 'U99G999D99') AS "U"
FROM DUAL;
Resultado:
L C U _______________________ ____________________ _______________________ $4.599,60 AUD4.599,60 $4.599,60