V databázi Oracle existuje několik různých parametrů NLS, které určují způsob zobrazení měny při použití funkcí jako TO_CHAR()
pro formátování čísla jako měny.
NLS_CURRENCY
určuje řetězec, který se má použít jako symbol místní měny proL
prvek formátu čísla.NLS_ISO_CURRENCY
určuje, co se má použít proC
prvek formátu.NLS_DUAL_CURRENCY
určuje, co se má použít proU
prvek formátu.
Výchozí hodnota pro tyto položky je určena NLS_TERRITORY
parametr.
Každý z těchto parametrů můžete změnit jednotlivě, pokud chcete, ale ve většině případů je lepší změnit NLS_TERRITORY
parametr. Je to proto, že se tím implicitně změní všechny ostatní parametry měny na jejich výchozí hodnoty pro dané území.
Vrátí aktuální hodnoty
Nejprve se zeptejme V$NLS_PARAMETERS
zobrazit, abyste zjistili, jaké jsou naše výchozí hodnoty:
VYBERTE PARAMETR, VALUEFROM V$NLS_PARAMETERSWHERE PARAMETER IN ( 'NLS_TERRITORY', 'NLS_CURRENCY', 'NLS_ISO_CURRENCY', 'NLS_DUAL_CURRENCY');
Výsledek:
HODNOTA PARAMETRU ____________________ ____________ NLS_TERRITORY AUSTRÁLIE NLS_CURRENCY $ NLS_ISO_CURRENCY AUSTRÁLIE NLS_DUAL_CURRENCY $
Územím je Austrálie a všechny parametry měny používají výchozí hodnoty pro toto území.
Změnit všechny symboly měn
Pojďme změnit NLS_TERRITORY
parametr na novou hodnotu:
ALTER SESSION SET NLS_TERRITORY ='Dánsko';
Výsledek:
Relace změněna.
Nyní znovu zkontrolujeme parametry NLS v naší měně:
VYBERTE PARAMETR, VALUEFROM V$NLS_PARAMETERSWHERE PARAMETER IN ( 'NLS_TERRITORY', 'NLS_CURRENCY', 'NLS_ISO_CURRENCY', 'NLS_DUAL_CURRENCY');
Výsledek:
HODNOTA PARAMETRU ____________________ __________ NLS_TERRITORY DÁNSKO NLS_CURRENCY kr NLS_ISO_CURRENCY DÁNSKO NLS_DUAL_CURRENCY EUR
Ohledně NLS_ISO_CURRENCY
Ačkoli to určuje, který symbol měny ISO se má použít, skutečný symbol měny se zde nevrací.
Následující příklad ilustruje, co mám na mysli:
SELECT TO_CHAR(45, 'L99') AS "L", TO_CHAR(45, 'C99') AS "C", TO_CHAR(45, 'U99') AS "U"FROM DUAL;
Výsledek:
L C U ________________ _____________ ______________ kr45 DKK 45 €
Tedy i když NLS_ISO_CURRENCY
parametr má hodnotu DÁNSKO
, C
element format vrátil DKK
, což je skutečný symbol měny ISO pro Dánsko.
Změna symbolů měn jednotlivě
Jak již bylo zmíněno, každý parametr NLS můžete explicitně nastavit samostatně.
Když jsme například v předchozím příkladu nastavili území na Dánsko, můžeme nyní přepsat kterýkoli (nebo všechny) symboly měny jejich explicitním nastavením:
ZMĚNIT SADA SEKCE NLS_CURRENCY ='$';ZMĚNIT SADA SEKCE NLS_ISO_CURRENCY ='AUSTRALIA';ZMĚNIT SADA SEKCE NLS_DUAL_CURRENCY =' $';
Výsledek:
Relace změněna.Relace změněna.Relace změněna.
Zde je to, co získáme spuštěním předchozího SELECT
prohlášení:
SELECT TO_CHAR(45, 'L99') AS "L", TO_CHAR(45, 'C99') AS "C", TO_CHAR(45, 'U99') AS "U"FROM DUAL;
Výsledek:
L C U ________________ _____________ ________________ $ 45 AUD45 $ 45
Takže i když naše území zůstává v Dánsku, naše symboly měn odrážejí jiné území (v tomto případě Austrálii).
Jedna věc, kterou je třeba mít na paměti, je, že se můžete dostat do situace, kdy vaše parametry měny neodrážejí jiné parametry, jako je NLS_NUMERIC_CHARACTERS
(což určuje, které znaky se mají použít pro oddělovač skupiny a desetinný znak).
Například:
SELECT TO_CHAR(4599,60, 'L99G999D99') AS "L", TO_CHAR(4599,60, 'C99G999D99') AS "C", TO_CHAR(4599,60, 'U99G999D"FROM') AS "DUAL" kód>
Výsledek:
L C U _______________________ ____________________ _______________________ $ 4.599,60 AUD, 60 AUD, 4.599,60 $ v ceně.V tomto případě máme australské symboly měn, ale oddělovač skupiny je tečka (
.
) a desetinným znakem je čárka (,
), který neodráží australské konvence (odráží konvenci používanou Dánskem). Australská konvence je obrácená – oddělovač skupiny je čárka (,
) a desetinným znakem je tečka (.
).Abychom to ilustrovali, zde je to, co dostaneme, pokud jednoduše resetujeme území na Austrálii a poté znovu spustíme příkaz:
ALTER SESSION SET NLS_TERRITORY ='Austrálie';VYBERTE TO_CHAR(4599,60, 'L99G999D99') JAKO "L", TO_CHAR(4599,60, 'C99G999D99') JAKO "C", TO99'CHAR99,9' JAKO "U" OD DUAL;
Výsledek:
L C U ________________________ ____________________ ________________________ $ 4 599,60 AUD 4 599,60 $ v ceně4 599,60 $ v ceně