В Oracle Database има няколко различни NLS параметъра, които определят как се показва валутата при използване на функции като TO_CHAR()
за да форматирате число като валута.
NLS_CURRENCY
определя низа, който да се използва като символ на местна валута заL
елемент с числов формат.NLS_ISO_CURRENCY
определя какво да се използва заC
форматен елемент.NLS_DUAL_CURRENCY
указва какво да се използва заU
форматен елемент.
Стойността по подразбиране за тях се определя от NLS_TERRITORY
параметър.
Можете да промените всеки от тези параметри поотделно, ако желаете, но в повечето случаи е по-добре да промените NLS_TERRITORY
параметър. Това е така, защото това имплицитно променя всички други параметри на валутата до техните стойности по подразбиране за тази територия.
Връщане на текущите стойности
Първо, нека да запитаме V$NLS_PARAMETERS
преглед, за да разберете какви са нашите стойности по подразбиране:
SELECT
PARAMETER,
VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER IN (
'NLS_TERRITORY',
'NLS_CURRENCY',
'NLS_ISO_CURRENCY',
'NLS_DUAL_CURRENCY'
);
Резултат:
PARAMETER VALUE ____________________ ____________ NLS_TERRITORY AUSTRALIA NLS_CURRENCY $ NLS_ISO_CURRENCY AUSTRALIA NLS_DUAL_CURRENCY $
Територията е Австралия и всички валутни параметри използват стойностите по подразбиране за тази територия.
Промяна на всички валутни символи
Нека променим NLS_TERRITORY
параметър към нова стойност:
ALTER SESSION SET NLS_TERRITORY = 'Denmark';
Резултат:
Session altered.
Сега нека отново проверим параметрите на нашата валута NLS:
SELECT
PARAMETER,
VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER IN (
'NLS_TERRITORY',
'NLS_CURRENCY',
'NLS_ISO_CURRENCY',
'NLS_DUAL_CURRENCY'
);
Резултат:
PARAMETER VALUE ____________________ __________ NLS_TERRITORY DENMARK NLS_CURRENCY kr NLS_ISO_CURRENCY DENMARK NLS_DUAL_CURRENCY €
Относно NLS_ISO_CURRENCY
параметър, въпреки че това определя кой символ на ISO валута да се използва, действителният символ на валута не се връща тук.
Следният пример илюстрира какво имам предвид:
SELECT
TO_CHAR(45, 'L99') AS "L",
TO_CHAR(45, 'C99') AS "C",
TO_CHAR(45, 'U99') AS "U"
FROM DUAL;
Резултат:
L C U ________________ _____________ ______________ kr45 DKK45 €45
Така че, въпреки че NLS_ISO_CURRENCY
параметърът има стойност DENMARK
, C
форматен елемент върна DKK
, което е действителният символ на валута ISO за Дания.
Променете символите на валутата поотделно
Както споменахме, можете изрично да зададете всеки NLS параметър поотделно.
Например, след като зададем територията на Дания в предишния пример, сега можем да заменим всеки (или всички) символи за валута, като ги зададем изрично:
ALTER SESSION SET NLS_CURRENCY = '$';
ALTER SESSION SET NLS_ISO_CURRENCY = 'AUSTRALIA';
ALTER SESSION SET NLS_DUAL_CURRENCY = '$';
Резултат:
Session altered. Session altered. Session altered.
Сега ето какво получаваме, когато стартираме предишния SELECT
изявление:
SELECT
TO_CHAR(45, 'L99') AS "L",
TO_CHAR(45, 'C99') AS "C",
TO_CHAR(45, 'U99') AS "U"
FROM DUAL;
Резултат:
L C U ________________ _____________ ________________ $45 AUD45 $45
Така че, въпреки че нашата територия остава в Дания, нашите валутни символи отразяват различна територия (в този случай Австралия).
Едно нещо, което трябва да имате предвид, когато правите това, е, че може да се окажете в ситуация, в която параметрите на вашата валута не отразяват други параметри, като например NLS_NUMERIC_CHARACTERS
(който определя кои знаци да се използват за разделителя на групата и десетичния знак).
Например:
SELECT
TO_CHAR(4599.60, 'L99G999D99') AS "L",
TO_CHAR(4599.60, 'C99G999D99') AS "C",
TO_CHAR(4599.60, 'U99G999D99') AS "U"
FROM DUAL;
Резултат:
L C U _______________________ ____________________ _______________________ $4.599,60 AUD4.599,60 $4.599,60
В този случай имаме символи за австралийски валути, но разделителят на групата е точка (.
). ) и десетичният знак е запетая (,
), което не отразява австралийските конвенции (отразява конвенцията, използвана от Дания). Австралийската конвенция е обратното – разделителят на групата е запетая (,
) и десетичният знак е точка (.
).
За да илюстрираме това, ето какво получаваме, ако просто нулираме територията на Австралия, след което стартираме изявлението отново:
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;
Резултат:
L C U _______________________ ____________________ _______________________ $4,599.60 AUD4,599.60 $4,599.60