Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como alterar o símbolo de moeda da sua sessão no Oracle


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 o L elemento de formato de número.
  • NLS_ISO_CURRENCY determina o que usar para o C elemento de formato.
  • NLS_DUAL_CURRENCY especifica o que usar para o U 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