W Oracle Database istnieje kilka różnych parametrów NLS, które określają sposób wyświetlania waluty podczas korzystania z funkcji takich jak TO_CHAR()
aby sformatować liczbę jako walutę.
NLS_CURRENCY
określa ciąg znaków, który ma być używany jako symbol waluty lokalnej dlaL
element formatu liczb.NLS_ISO_CURRENCY
określa, czego użyć dlaC
element formatu.NLS_DUAL_CURRENCY
określa, czego użyć dlaU
element formatu.
Domyślna wartość dla nich jest określona przez NLS_TERRITORY
parametr.
Możesz zmienić każdy z tych parametrów indywidualnie, jeśli chcesz, ale w większości przypadków lepiej zmienić NLS_TERRITORY
parametr. Dzieje się tak, ponieważ robi to domyślnie zmienia wszystkie inne parametry waluty na ich wartości domyślne dla tego terytorium.
Zwróć aktualne wartości
Najpierw zapytajmy o V$NLS_PARAMETERS
Zobacz, aby dowiedzieć się, jakie są nasze wartości domyślne:
SELECT
PARAMETER,
VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER IN (
'NLS_TERRITORY',
'NLS_CURRENCY',
'NLS_ISO_CURRENCY',
'NLS_DUAL_CURRENCY'
);
Wynik:
PARAMETER VALUE ____________________ ____________ NLS_TERRITORY AUSTRALIA NLS_CURRENCY $ NLS_ISO_CURRENCY AUSTRALIA NLS_DUAL_CURRENCY $
Terytorium to Australia, a wszystkie parametry waluty używają wartości domyślnych dla tego terytorium.
Zmień wszystkie symbole walut
Zmieńmy NLS_TERRITORY
parametr na nową wartość:
ALTER SESSION SET NLS_TERRITORY = 'Denmark';
Wynik:
Session altered.
Sprawdźmy teraz ponownie nasze parametry NLS waluty:
SELECT
PARAMETER,
VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER IN (
'NLS_TERRITORY',
'NLS_CURRENCY',
'NLS_ISO_CURRENCY',
'NLS_DUAL_CURRENCY'
);
Wynik:
PARAMETER VALUE ____________________ __________ NLS_TERRITORY DENMARK NLS_CURRENCY kr NLS_ISO_CURRENCY DENMARK NLS_DUAL_CURRENCY €
Odnośnie NLS_ISO_CURRENCY
parametr, chociaż określa, którego symbolu waluty ISO użyć, rzeczywisty symbol waluty nie jest tutaj zwracany.
Poniższy przykład ilustruje, co mam na myśli:
SELECT
TO_CHAR(45, 'L99') AS "L",
TO_CHAR(45, 'C99') AS "C",
TO_CHAR(45, 'U99') AS "U"
FROM DUAL;
Wynik:
L C U ________________ _____________ ______________ kr45 DKK45 €45
Tak więc, mimo że NLS_ISO_CURRENCY
parametr ma wartość DENMARK
, C
zwrócony element formatu DKK
, który jest rzeczywistym symbolem waluty ISO dla Danii.
Pojedynczo zmieniaj symbole walut
Jak wspomniano, każdy parametr NLS można ustawić osobno.
Na przykład, po ustawieniu terytorium na Danię w poprzednim przykładzie, możemy teraz zastąpić dowolny (lub wszystkie) symbole waluty, ustawiając je jawnie:
ALTER SESSION SET NLS_CURRENCY = '$';
ALTER SESSION SET NLS_ISO_CURRENCY = 'AUSTRALIA';
ALTER SESSION SET NLS_DUAL_CURRENCY = '$';
Wynik:
Session altered. Session altered. Session altered.
Oto, co otrzymujemy, uruchamiając poprzedni SELECT
oświadczenie:
SELECT
TO_CHAR(45, 'L99') AS "L",
TO_CHAR(45, 'C99') AS "C",
TO_CHAR(45, 'U99') AS "U"
FROM DUAL;
Wynik:
L C U ________________ _____________ ________________ $45 AUD45 $45
Tak więc, mimo że nasze terytorium pozostaje w Danii, nasze symbole walut odzwierciedlają inne terytorium (w tym przypadku Australia).
Jedną z rzeczy, o których należy pamiętać podczas robienia tego, jest to, że możesz znaleźć się w sytuacji, w której parametry Twojej waluty nie odzwierciedlają innych parametrów, takich jak NLS_NUMERIC_CHARACTERS
(co określa, które znaki mają być używane jako separator grup i znak dziesiętny).
Na przykład:
SELECT
TO_CHAR(4599.60, 'L99G999D99') AS "L",
TO_CHAR(4599.60, 'C99G999D99') AS "C",
TO_CHAR(4599.60, 'U99G999D99') AS "U"
FROM DUAL;
Wynik:
L C U _______________________ ____________________ _______________________ $4.599,60 AUD4.599,60 $4.599,60
W tym przypadku mamy symbole walut australijskich, ale separatorem grup jest kropka (.
), a znak dziesiętny to przecinek (,
), która nie odzwierciedla konwencji australijskich (odzwierciedla konwencję stosowaną przez Danię). Konwencja australijska jest na odwrót – separatorem grup jest przecinek (,
), a znak dziesiętny to kropka (.
).
Aby to zilustrować, oto, co otrzymamy, jeśli po prostu zresetujemy terytorium do Australii, a następnie ponownie uruchomimy oświadczenie:
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;
Wynik:
L C U _______________________ ____________________ _______________________ $4,599.60 AUD4,599.60 $4,599.60