В 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