I Oracle Database finns det några olika NLS-parametrar som bestämmer hur valutan visas när du använder funktioner som TO_CHAR()
för att formatera ett tal som en valuta.
NLS_CURRENCY
anger strängen som ska användas som lokal valutasymbol förL
nummerformatelement.NLS_ISO_CURRENCY
bestämmer vad som ska användas förC
formatelement.NLS_DUAL_CURRENCY
anger vad som ska användas förU
formatelement.
Standardvärdet för dessa bestäms av NLS_TERRITORY
parameter.
Du kan ändra var och en av dessa parametrar individuellt om du vill, men i de flesta fall är det bättre att ändra NLS_TERRITORY
parameter. Det beror på att det implicit ändrar alla andra valutaparametrar till deras standardvärden för det territoriet.
Återställ aktuella värden
Låt oss först fråga V$NLS_PARAMETERS
visa för att ta reda på vilka våra standardvärden är:
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 $
Territoriet är Australien, och alla valutaparametrar använder standardvärdena för detta territorium.
Ändra alla valutasymboler
Låt oss ändra NLS_TERRITORY
parameter till ett nytt värde:
ALTER SESSION SET NLS_TERRITORY = 'Denmark';
Resultat:
Session altered.
Låt oss nu kontrollera våra valuta-NLS-parametrar 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 €
Angående NLS_ISO_CURRENCY
parameter, även om detta bestämmer vilken ISO-valutasymbol som ska användas, returneras inte den faktiska valutasymbolen här.
Följande exempel illustrerar vad jag menar:
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å även om NLS_ISO_CURRENCY
parametern har värdet DENMARK
, C
formatelement returnerade DKK
, som är den faktiska ISO-valutasymbolen för Danmark.
Ändra valutasymbolerna individuellt
Som nämnts kan du uttryckligen ställa in varje NLS-parameter individuellt.
Till exempel, efter att ha ställt in territoriet till Danmark i föregående exempel, kan vi nu åsidosätta vilken som helst (eller alla) valutasymbolerna genom att ställa in dem explicit:
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.
Nu är det här vad vi får när vi kör den tidigare SELECT
uttalande:
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å även om vårt territorium förblir i Danmark, speglar våra valutasymboler ett annat territorium (i det här fallet Australien).
En sak att tänka på när du gör detta är att du kan hamna i en situation där dina valutaparametrar inte reflekterar andra parametrar, som NLS_NUMERIC_CHARACTERS
(som bestämmer vilka tecken som ska användas för gruppavgränsare och decimaltecken).
Till exempel:
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 det här fallet har vi australiska valutasymboler, men gruppavgränsaren är en punkt (.
) och decimaltecknet är ett kommatecken (,
), vilket inte återspeglar australiensiska konventioner (det återspeglar den konvention som används av Danmark). Australisk konvention är tvärtom – gruppseparatorn är ett kommatecken (,
) och decimaltecknet är en punkt (.
).
För att illustrera detta, här är vad vi får om vi helt enkelt återställer territoriet till Australien och sedan kör uttalandet 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