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_CURRENCYanger strängen som ska användas som lokal valutasymbol förLnummerformatelement.NLS_ISO_CURRENCYbestämmer vad som ska användas förCformatelement.NLS_DUAL_CURRENCYanger vad som ska användas förUformatelement.
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