In Oracle Database zijn er een paar verschillende NLS-parameters die bepalen hoe valuta wordt weergegeven bij gebruik van functies zoals TO_CHAR()
om een getal als valuta op te maken.
NLS_CURRENCY
specificeert de tekenreeks die moet worden gebruikt als het lokale valutasymbool voor deL
getal formaat element.NLS_ISO_CURRENCY
bepaalt wat te gebruiken voor deC
formaatelement.NLS_DUAL_CURRENCY
specificeert wat te gebruiken voor deU
formaatelement.
De standaardwaarde hiervoor wordt bepaald door de NLS_TERRITORY
parameter.
U kunt elk van deze parameters afzonderlijk wijzigen als u dat wilt, maar in de meeste gevallen kunt u beter de NLS_TERRITORY
wijzigen parameter. Dat komt omdat, als u dit doet, impliciet alle andere valutaparameters worden gewijzigd in hun standaardwaarden voor dat gebied.
Retourneer de huidige waarden
Laten we eerst de V$NLS_PARAMETERS
. opvragen bekijken om te zien wat onze standaardwaarden zijn:
SELECT
PARAMETER,
VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER IN (
'NLS_TERRITORY',
'NLS_CURRENCY',
'NLS_ISO_CURRENCY',
'NLS_DUAL_CURRENCY'
);
Resultaat:
PARAMETER VALUE ____________________ ____________ NLS_TERRITORY AUSTRALIA NLS_CURRENCY $ NLS_ISO_CURRENCY AUSTRALIA NLS_DUAL_CURRENCY $
Het territorium is Australië en alle valutaparameters gebruiken de standaardwaarden voor dit territorium.
Wijzig alle valutasymbolen
Laten we de NLS_TERRITORY
wijzigen parameter naar een nieuwe waarde:
ALTER SESSION SET NLS_TERRITORY = 'Denmark';
Resultaat:
Session altered.
Laten we nu nogmaals onze valuta NLS-parameters controleren:
SELECT
PARAMETER,
VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER IN (
'NLS_TERRITORY',
'NLS_CURRENCY',
'NLS_ISO_CURRENCY',
'NLS_DUAL_CURRENCY'
);
Resultaat:
PARAMETER VALUE ____________________ __________ NLS_TERRITORY DENMARK NLS_CURRENCY kr NLS_ISO_CURRENCY DENMARK NLS_DUAL_CURRENCY €
Met betrekking tot de NLS_ISO_CURRENCY
parameter, hoewel dit bepaalt welk ISO-valutasymbool moet worden gebruikt, wordt het werkelijke valutasymbool hier niet geretourneerd.
Het volgende voorbeeld illustreert wat ik bedoel:
SELECT
TO_CHAR(45, 'L99') AS "L",
TO_CHAR(45, 'C99') AS "C",
TO_CHAR(45, 'U99') AS "U"
FROM DUAL;
Resultaat:
L C U ________________ _____________ ______________ kr45 DKK45 €45
Dus, hoewel de NLS_ISO_CURRENCY
parameter heeft een waarde van DENMARK
, de C
formaatelement geretourneerd DKK
, het eigenlijke ISO-valutasymbool voor Denemarken.
Verander de valutasymbolen afzonderlijk
Zoals vermeld, kunt u elke NLS-parameter expliciet afzonderlijk instellen.
Als we bijvoorbeeld het gebied in het vorige voorbeeld op Denemarken hebben ingesteld, kunnen we nu alle (of alle) valutasymbolen overschrijven door ze expliciet in te stellen:
ALTER SESSION SET NLS_CURRENCY = '$';
ALTER SESSION SET NLS_ISO_CURRENCY = 'AUSTRALIA';
ALTER SESSION SET NLS_DUAL_CURRENCY = '$';
Resultaat:
Session altered. Session altered. Session altered.
Dit is wat we krijgen bij het uitvoeren van de vorige SELECT
verklaring:
SELECT
TO_CHAR(45, 'L99') AS "L",
TO_CHAR(45, 'C99') AS "C",
TO_CHAR(45, 'U99') AS "U"
FROM DUAL;
Resultaat:
L C U ________________ _____________ ________________ $45 AUD45 $45
Dus hoewel ons territorium Denemarken blijft, geven onze valutasymbolen een ander territorium weer (in dit geval Australië).
Een ding om rekening mee te houden wanneer u dit doet, is dat u in een situatie terecht kunt komen waarin uw valutaparameters niet overeenkomen met andere parameters, zoals NLS_NUMERIC_CHARACTERS
(die bepaalt welke tekens worden gebruikt voor het groepsscheidingsteken en het decimale teken).
Bijvoorbeeld:
SELECT
TO_CHAR(4599.60, 'L99G999D99') AS "L",
TO_CHAR(4599.60, 'C99G999D99') AS "C",
TO_CHAR(4599.60, 'U99G999D99') AS "U"
FROM DUAL;
Resultaat:
L C U _______________________ ____________________ _______________________ $4.599,60 AUD4.599,60 $4.599,60
In dit geval hebben we Australische valutasymbolen, maar het groepsscheidingsteken is een punt (.
) en het decimale teken is een komma (,
), die de Australische conventies niet weerspiegelt (het weerspiegelt de conventie die door Denemarken wordt gebruikt). Australische conventie is andersom – het groepsscheidingsteken is een komma (,
) en het decimale teken is een punt (.
).
Om dit te illustreren, is dit wat we krijgen als we het territorium eenvoudig terugzetten naar Australië en de instructie vervolgens opnieuw uitvoeren:
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;
Resultaat:
L C U _______________________ ____________________ _______________________ $4,599.60 AUD4,599.60 $4,599.60