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_CURRENCYokreśla ciąg znaków, który ma być używany jako symbol waluty lokalnej dlaLelement formatu liczb.NLS_ISO_CURRENCYokreśla, czego użyć dlaCelement formatu.NLS_DUAL_CURRENCYokreśla, czego użyć dlaUelement 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