I Oracle Database er der et par forskellige NLS-parametre, der bestemmer, hvordan valuta vises, når du bruger funktioner som TO_CHAR()
for at formatere et tal som en valuta.
NLS_CURRENCY
angiver den streng, der skal bruges som det lokale valutasymbol forL
talformatelement.NLS_ISO_CURRENCY
bestemmer, hvad der skal bruges tilC
formatelement.NLS_DUAL_CURRENCY
angiver, hvad der skal bruges tilU
formatelement.
Standardværdien for disse bestemmes af NLS_TERRITORY
parameter.
Du kan ændre hver af disse parametre individuelt, hvis du ønsker det, men i de fleste tilfælde er det bedre at ændre NLS_TERRITORY
parameter. Det er fordi, at gøre det implicit ændrer alle de andre valutaparametre til deres standardværdier for det pågældende område.
Returner de aktuelle værdier
Lad os først forespørge på V$NLS_PARAMETERS
for at finde ud af, hvad vores standardværdier er:
SELECT
PARAMETER,
VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER IN (
'NLS_TERRITORY',
'NLS_CURRENCY',
'NLS_ISO_CURRENCY',
'NLS_DUAL_CURRENCY'
);
Resultat:
PARAMETER VALUE ____________________ ____________ NLS_TERRITORY AUSTRALIA NLS_CURRENCY $ NLS_ISO_CURRENCY AUSTRALIA NLS_DUAL_CURRENCY $
Området er Australien, og alle valutaparametre bruger standardværdierne for dette område.
Skift alle valutasymboler
Lad os ændre NLS_TERRITORY
parameter til en ny værdi:
ALTER SESSION SET NLS_TERRITORY = 'Denmark';
Resultat:
Session altered.
Lad os nu tjekke vores valuta NLS-parametre igen:
SELECT
PARAMETER,
VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER IN (
'NLS_TERRITORY',
'NLS_CURRENCY',
'NLS_ISO_CURRENCY',
'NLS_DUAL_CURRENCY'
);
Resultat:
PARAMETER VALUE ____________________ __________ NLS_TERRITORY DENMARK NLS_CURRENCY kr NLS_ISO_CURRENCY DENMARK NLS_DUAL_CURRENCY €
Med hensyn til NLS_ISO_CURRENCY
parameter, selvom dette bestemmer hvilket ISO-valutasymbol der skal bruges, returneres det faktiske valutasymbol ikke her.
Følgende eksempel illustrerer, hvad jeg mener:
SELECT
TO_CHAR(45, 'L99') AS "L",
TO_CHAR(45, 'C99') AS "C",
TO_CHAR(45, 'U99') AS "U"
FROM DUAL;
Resultat:
L C U ________________ _____________ ______________ kr45 DKK45 €45
Så selvom NLS_ISO_CURRENCY
parameteren har en værdi på DENMARK
, C
formatelement returnerede DKK
, som er det egentlige ISO-valutasymbol for Danmark.
Skift valutasymbolerne individuelt
Som nævnt kan du udtrykkeligt indstille hver NLS-parameter individuelt.
For eksempel, efter at have sat territoriet til Danmark i det foregående eksempel, kan vi nu tilsidesætte et hvilket som helst (eller alle) valutasymbolerne ved at indstille dem eksplicit:
ALTER SESSION SET NLS_CURRENCY = '$';
ALTER SESSION SET NLS_ISO_CURRENCY = 'AUSTRALIA';
ALTER SESSION SET NLS_DUAL_CURRENCY = '$';
Resultat:
Session altered. Session altered. Session altered.
Her er hvad vi får, når vi kører den forrige SELECT
erklæring:
SELECT
TO_CHAR(45, 'L99') AS "L",
TO_CHAR(45, 'C99') AS "C",
TO_CHAR(45, 'U99') AS "U"
FROM DUAL;
Resultat:
L C U ________________ _____________ ________________ $45 AUD45 $45
Så selvom vores territorium forbliver i Danmark, afspejler vores valutasymboler et andet territorium (i dette tilfælde Australien).
En ting, du skal være opmærksom på, når du gør dette, er, at du kan ende i en situation, hvor dine valutaparametre ikke afspejler andre parametre, såsom NLS_NUMERIC_CHARACTERS
(som bestemmer, hvilke tegn der skal bruges til gruppeseparator og decimaltegn).
For eksempel:
SELECT
TO_CHAR(4599.60, 'L99G999D99') AS "L",
TO_CHAR(4599.60, 'C99G999D99') AS "C",
TO_CHAR(4599.60, 'U99G999D99') AS "U"
FROM DUAL;
Resultat:
L C U _______________________ ____________________ _______________________ $4.599,60 AUD4.599,60 $4.599,60
I dette tilfælde har vi australske valutasymboler, men gruppeseparatoren er et punktum (.
), og decimaltegnet er et komma (,
), som ikke afspejler australske konventioner (det afspejler den konvention, Danmark bruger). Australsk konvention er omvendt – gruppeseparatoren er et komma (,
), og decimaltegnet er et punktum (.
).
For at illustrere dette er her, hvad vi får, hvis vi blot nulstiller territoriet til Australien og derefter kører erklæringen igen:
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;
Resultat:
L C U _______________________ ____________________ _______________________ $4.599,60 AUD4.599,60 $4.599,60