In Oracle Database, ci sono alcuni parametri NLS diversi che determinano come viene visualizzata la valuta quando si utilizzano funzioni come TO_CHAR()
per formattare un numero come valuta.
NLS_CURRENCY
specifica la stringa da utilizzare come simbolo di valuta locale per laL
elemento formato numero.NLS_ISO_CURRENCY
determina cosa usare per laC
elemento di formato.NLS_DUAL_CURRENCY
specifica cosa usare per laU
elemento di formato.
Il valore predefinito per questi è determinato da NLS_TERRITORY
parametro.
Puoi modificare ciascuno di questi parametri individualmente se lo desideri, ma nella maggior parte dei casi è meglio cambiare il NLS_TERRITORY
parametro. Questo perché, così facendo, si modificano implicitamente tutti gli altri parametri valutari sui valori predefiniti per quel territorio.
Restituisci i valori correnti
Per prima cosa, interroghiamo V$NLS_PARAMETERS
visualizza per scoprire quali sono i nostri valori predefiniti:
SELECT
PARAMETER,
VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER IN (
'NLS_TERRITORY',
'NLS_CURRENCY',
'NLS_ISO_CURRENCY',
'NLS_DUAL_CURRENCY'
);
Risultato:
PARAMETER VALUE ____________________ ____________ NLS_TERRITORY AUSTRALIA NLS_CURRENCY $ NLS_ISO_CURRENCY AUSTRALIA NLS_DUAL_CURRENCY $
Il territorio è l'Australia e tutti i parametri valutari utilizzano i valori predefiniti per questo territorio.
Cambia tutti i simboli di valuta
Cambiamo il NLS_TERRITORY
parametro a un nuovo valore:
ALTER SESSION SET NLS_TERRITORY = 'Denmark';
Risultato:
Session altered.
Ora controlliamo di nuovo i nostri parametri NLS di valuta:
SELECT
PARAMETER,
VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER IN (
'NLS_TERRITORY',
'NLS_CURRENCY',
'NLS_ISO_CURRENCY',
'NLS_DUAL_CURRENCY'
);
Risultato:
PARAMETER VALUE ____________________ __________ NLS_TERRITORY DENMARK NLS_CURRENCY kr NLS_ISO_CURRENCY DENMARK NLS_DUAL_CURRENCY €
Per quanto riguarda il NLS_ISO_CURRENCY
parametro, sebbene questo determini quale simbolo di valuta ISO utilizzare, il simbolo di valuta effettivo non viene restituito qui.
L'esempio seguente illustra cosa intendo:
SELECT
TO_CHAR(45, 'L99') AS "L",
TO_CHAR(45, 'C99') AS "C",
TO_CHAR(45, 'U99') AS "U"
FROM DUAL;
Risultato:
L C U ________________ _____________ ______________ kr45 DKK45 €45
Quindi, anche se il NLS_ISO_CURRENCY
il parametro ha un valore di DENMARK
, il C
elemento di formato restituito DKK
, che è l'attuale simbolo della valuta ISO per la Danimarca.
Cambia i simboli di valuta singolarmente
Come accennato, puoi impostare in modo esplicito ogni parametro NLS individualmente.
Ad esempio, dopo aver impostato il territorio sulla Danimarca nell'esempio precedente, ora possiamo sovrascrivere uno qualsiasi (o tutti) i simboli di valuta impostandoli esplicitamente:
ALTER SESSION SET NLS_CURRENCY = '$';
ALTER SESSION SET NLS_ISO_CURRENCY = 'AUSTRALIA';
ALTER SESSION SET NLS_DUAL_CURRENCY = '$';
Risultato:
Session altered. Session altered. Session altered.
Ora ecco cosa otteniamo eseguendo il precedente SELECT
dichiarazione:
SELECT
TO_CHAR(45, 'L99') AS "L",
TO_CHAR(45, 'C99') AS "C",
TO_CHAR(45, 'U99') AS "U"
FROM DUAL;
Risultato:
L C U ________________ _____________ ________________ $45 AUD45 $45
Quindi, anche se il nostro territorio rimane in Danimarca, i nostri simboli di valuta riflettono un territorio diverso (in questo caso, l'Australia).
Una cosa a cui prestare attenzione quando si esegue questa operazione è che potresti trovarti in una situazione in cui i parametri della tua valuta non riflettono altri parametri, come NLS_NUMERIC_CHARACTERS
(che determina quali caratteri utilizzare per il separatore di gruppo e il carattere decimale).
Ad esempio:
SELECT
TO_CHAR(4599.60, 'L99G999D99') AS "L",
TO_CHAR(4599.60, 'C99G999D99') AS "C",
TO_CHAR(4599.60, 'U99G999D99') AS "U"
FROM DUAL;
Risultato:
L C U _______________________ ____________________ _______________________ $4.599,60 AUD4.599,60 $4.599,60
In questo caso, abbiamo i simboli di valuta australiana, ma il separatore di gruppo è un punto (.
) e il carattere decimale è una virgola (,
), che non riflette le convenzioni australiane (rispecchia la convenzione utilizzata dalla Danimarca). La convenzione australiana è il contrario:il separatore di gruppo è una virgola (,
) e il carattere decimale è un punto (.
).
Per illustrare questo, ecco cosa otteniamo se reimpostiamo semplicemente il territorio all'Australia, quindi eseguiamo nuovamente l'istruzione:
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;
Risultato:
L C U _______________________ ____________________ _______________________ $4.599,60 AUD4.599,60 $4.599,60