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_CURRENCYespecifica a string a ser usada como o símbolo da moeda local para oLelemento de formato de número.NLS_ISO_CURRENCYdetermina o que usar para oCelemento de formato.NLS_DUAL_CURRENCYespecifica o que usar para oUelemento 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