sql >> Base de Datos >  >> RDS >> Oracle

Cómo cambiar el símbolo de moneda de su sesión en Oracle

En Oracle Database, hay algunos parámetros NLS diferentes que determinan cómo se muestra la moneda cuando se usan funciones como TO_CHAR() para dar formato a un número como moneda.

  • NLS_CURRENCY especifica la cadena que se utilizará como símbolo de moneda local para L elemento de formato de número.
  • NLS_ISO_CURRENCY determina qué usar para el C elemento de formato.
  • NLS_DUAL_CURRENCY especifica qué usar para la U elemento de formato.

El valor predeterminado para estos está determinado por el NLS_TERRITORY parámetro.

Puede cambiar cada uno de estos parámetros individualmente si lo desea, pero en la mayoría de los casos, es mejor cambiar el NLS_TERRITORY parámetro. Esto se debe a que, al hacerlo, cambia implícitamente todos los demás parámetros de moneda a sus valores predeterminados para ese territorio.

Devolver los valores actuales

Primero, consultemos el V$NLS_PARAMETERS ver para averiguar cuáles son nuestros valores predeterminados:

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    $           

El territorio es Australia y todos los parámetros de moneda utilizan los valores predeterminados para este territorio.

Cambiar todos los símbolos de moneda

Cambiemos el NLS_TERRITORY parámetro a un nuevo valor:

ALTER SESSION SET NLS_TERRITORY = 'Denmark';

Resultado:

Session altered.

Ahora revisemos nuestros parámetros NLS de moneda nuevamente:

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    €          

Con respecto a la NLS_ISO_CURRENCY parámetro, aunque esto determina qué símbolo de moneda ISO usar, el símbolo de moneda real no se devuelve aquí.

El siguiente ejemplo ilustra lo que quiero decir:

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   

Entonces, aunque la NLS_ISO_CURRENCY el parámetro tiene un valor de DENMARK , el C elemento de formato devuelto DKK , que es el símbolo de moneda ISO real para Dinamarca.

Cambie los símbolos de moneda individualmente

Como se mencionó, puede configurar explícitamente cada parámetro NLS individualmente.

Por ejemplo, habiendo establecido el territorio en Dinamarca en el ejemplo anterior, ahora podemos anular cualquiera (o todos) los símbolos de moneda configurándolos explícitamente:

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.

Ahora esto es lo que obtenemos cuando ejecutamos el SELECT anterior declaración:

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   

Entonces, aunque nuestro territorio sigue siendo Dinamarca, nuestros símbolos de moneda reflejan un territorio diferente (en este caso, Australia).

Una cosa que debe tener en cuenta al hacer esto es que podría terminar en una situación en la que sus parámetros de moneda no reflejen otros parámetros, como NLS_NUMERIC_CHARACTERS (que determina qué caracteres usar para el separador de grupo y el carácter decimal).

Por ejemplo:

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   

En este caso, tenemos símbolos de moneda australiana, pero el separador de grupo es un punto (. ) y el carácter decimal es una coma (, ), que no refleja las convenciones australianas (refleja la convención utilizada por Dinamarca). La convención australiana es al revés:el separador de grupo es una coma (, ) y el carácter decimal es un punto (. ).

Para ilustrar esto, esto es lo que obtenemos si simplemente restablecemos el territorio a Australia y luego ejecutamos la instrucción nuevamente:

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