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 paraL
elemento de formato de número.NLS_ISO_CURRENCY
determina qué usar para elC
elemento de formato.NLS_DUAL_CURRENCY
especifica qué usar para laU
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