In Oracle Database gibt es einige verschiedene NLS-Parameter, die bestimmen, wie die Währung angezeigt wird, wenn Funktionen wie TO_CHAR()
verwendet werden um eine Zahl als Währung zu formatieren.
NLS_CURRENCY
gibt die Zeichenfolge an, die als lokales Währungssymbol fürL
verwendet werden soll Zahlenformatelement.NLS_ISO_CURRENCY
bestimmt, was fürC
verwendet werden soll format-Element.NLS_DUAL_CURRENCY
gibt an, was fürU
verwendet werden soll format-Element.
Der Standardwert für diese wird durch das NLS_TERRITORY
bestimmt Parameter.
Sie können jeden dieser Parameter einzeln ändern, wenn Sie möchten, aber in den meisten Fällen ist es besser, NLS_TERRITORY
zu ändern Parameter. Das liegt daran, dass dadurch implizit alle anderen Währungsparameter auf ihre Standardwerte für dieses Gebiet geändert werden.
Gib die aktuellen Werte zurück
Lassen Sie uns zuerst die V$NLS_PARAMETERS
abfragen view um herauszufinden, was unsere Standardwerte sind:
SELECT
PARAMETER,
VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER IN (
'NLS_TERRITORY',
'NLS_CURRENCY',
'NLS_ISO_CURRENCY',
'NLS_DUAL_CURRENCY'
);
Ergebnis:
PARAMETER VALUE ____________________ ____________ NLS_TERRITORY AUSTRALIA NLS_CURRENCY $ NLS_ISO_CURRENCY AUSTRALIA NLS_DUAL_CURRENCY $
Das Gebiet ist Australien und alle Währungsparameter verwenden die Standardwerte für dieses Gebiet.
Alle Währungssymbole ändern
Lassen Sie uns das NLS_TERRITORY
ändern Parameter auf einen neuen Wert:
ALTER SESSION SET NLS_TERRITORY = 'Denmark';
Ergebnis:
Session altered.
Lassen Sie uns nun unsere Währungs-NLS-Parameter erneut überprüfen:
SELECT
PARAMETER,
VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER IN (
'NLS_TERRITORY',
'NLS_CURRENCY',
'NLS_ISO_CURRENCY',
'NLS_DUAL_CURRENCY'
);
Ergebnis:
PARAMETER VALUE ____________________ __________ NLS_TERRITORY DENMARK NLS_CURRENCY kr NLS_ISO_CURRENCY DENMARK NLS_DUAL_CURRENCY €
In Bezug auf NLS_ISO_CURRENCY
Parameter, obwohl dieser bestimmt, welches ISO-Währungssymbol verwendet werden soll, wird das eigentliche Währungssymbol hier nicht zurückgegeben.
Das folgende Beispiel veranschaulicht, was ich meine:
SELECT
TO_CHAR(45, 'L99') AS "L",
TO_CHAR(45, 'C99') AS "C",
TO_CHAR(45, 'U99') AS "U"
FROM DUAL;
Ergebnis:
L C U ________________ _____________ ______________ kr45 DKK45 €45
Also, obwohl die NLS_ISO_CURRENCY
Parameter hat den Wert DENMARK
, das C
Formatelement gab DKK
zurück , das eigentliche ISO-Währungssymbol für Dänemark.
Ändern Sie die Währungssymbole einzeln
Wie bereits erwähnt, können Sie jeden NLS-Parameter explizit einzeln festlegen.
Nachdem wir beispielsweise das Gebiet im vorherigen Beispiel auf Dänemark gesetzt haben, können wir jetzt jedes (oder alle) Währungssymbol überschreiben, indem wir sie explizit setzen:
ALTER SESSION SET NLS_CURRENCY = '$';
ALTER SESSION SET NLS_ISO_CURRENCY = 'AUSTRALIA';
ALTER SESSION SET NLS_DUAL_CURRENCY = '$';
Ergebnis:
Session altered. Session altered. Session altered.
Hier ist, was wir bekommen, wenn wir das vorherige SELECT
ausführen Aussage:
SELECT
TO_CHAR(45, 'L99') AS "L",
TO_CHAR(45, 'C99') AS "C",
TO_CHAR(45, 'U99') AS "U"
FROM DUAL;
Ergebnis:
L C U ________________ _____________ ________________ $45 AUD45 $45
Obwohl unser Territorium in Dänemark bleibt, spiegeln unsere Währungssymbole also ein anderes Territorium wider (in diesem Fall Australien).
Beachten Sie dabei, dass Sie in eine Situation geraten könnten, in der Ihre Währungsparameter andere Parameter wie NLS_NUMERIC_CHARACTERS
nicht widerspiegeln (der bestimmt, welche Zeichen für das Gruppentrennzeichen und das Dezimalzeichen verwendet werden sollen).
Zum Beispiel:
SELECT
TO_CHAR(4599.60, 'L99G999D99') AS "L",
TO_CHAR(4599.60, 'C99G999D99') AS "C",
TO_CHAR(4599.60, 'U99G999D99') AS "U"
FROM DUAL;
Ergebnis:
L C U _______________________ ____________________ _______________________ $4.599,60 AUD4.599,60 $4.599,60
In diesem Fall haben wir australische Währungssymbole, aber das Gruppentrennzeichen ist ein Punkt (.
) und das Dezimalzeichen ist ein Komma (,
), die nicht die australischen Konventionen widerspiegelt (es spiegelt die von Dänemark verwendete Konvention wider). Die australische Konvention ist umgekehrt – das Gruppentrennzeichen ist ein Komma (,
) und das Dezimalzeichen ist ein Punkt (.
).
Um dies zu veranschaulichen, erhalten wir Folgendes, wenn wir das Gebiet einfach auf Australien zurücksetzen und die Anweisung dann erneut ausführen:
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;
Ergebnis:
L C U _______________________ ____________________ _______________________ $4.599,60 AUD4.599,60 $4.599,60