Trong Cơ sở dữ liệu Oracle, có một vài tham số NLS khác nhau xác định cách tiền tệ được hiển thị khi sử dụng các hàm như TO_CHAR()
để định dạng một số dưới dạng đơn vị tiền tệ.
-
NLS_CURRENCY
chỉ định chuỗi để sử dụng làm ký hiệu nội tệ choL
phần tử định dạng số. -
NLS_ISO_CURRENCY
xác định những gì sẽ sử dụng choC
phần tử định dạng. -
NLS_DUAL_CURRENCY
chỉ định những gì sẽ sử dụng choU
phần tử định dạng.
Giá trị mặc định cho những thứ này được xác định bởi NLS_TERRITORY
tham số.
Bạn có thể thay đổi từng tham số này riêng lẻ nếu muốn, nhưng trong hầu hết các trường hợp, bạn nên thay đổi NLS_TERRITORY
tham số. Đó là bởi vì, làm như vậy hoàn toàn thay đổi tất cả các thông số tiền tệ khác thành giá trị mặc định của chúng cho lãnh thổ đó.
Trả lại các giá trị hiện tại
Đầu tiên, hãy truy vấn V$NLS_PARAMETERS
xem để tìm hiểu giá trị mặc định của chúng tôi là gì:
SELECT
PARAMETER,
VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER IN (
'NLS_TERRITORY',
'NLS_CURRENCY',
'NLS_ISO_CURRENCY',
'NLS_DUAL_CURRENCY'
);
Kết quả:
PARAMETER VALUE ____________________ ____________ NLS_TERRITORY AUSTRALIA NLS_CURRENCY $ NLS_ISO_CURRENCY AUSTRALIA NLS_DUAL_CURRENCY $
Lãnh thổ là Úc và tất cả các thông số tiền tệ sử dụng các giá trị mặc định cho lãnh thổ này.
Thay đổi tất cả các ký hiệu tiền tệ
Hãy thay đổi NLS_TERRITORY
tham số thành một giá trị mới:
ALTER SESSION SET NLS_TERRITORY = 'Denmark';
Kết quả:
Session altered.
Bây giờ chúng ta hãy kiểm tra lại các thông số NLS tiền tệ của chúng ta:
SELECT
PARAMETER,
VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER IN (
'NLS_TERRITORY',
'NLS_CURRENCY',
'NLS_ISO_CURRENCY',
'NLS_DUAL_CURRENCY'
);
Kết quả:
PARAMETER VALUE ____________________ __________ NLS_TERRITORY DENMARK NLS_CURRENCY kr NLS_ISO_CURRENCY DENMARK NLS_DUAL_CURRENCY €
Về NLS_ISO_CURRENCY
, mặc dù điều này xác định ký hiệu tiền tệ ISO nào sẽ sử dụng, nhưng ký hiệu tiền tệ thực tế không được trả lại ở đây.
Ví dụ sau minh họa ý tôi muốn nói:
SELECT
TO_CHAR(45, 'L99') AS "L",
TO_CHAR(45, 'C99') AS "C",
TO_CHAR(45, 'U99') AS "U"
FROM DUAL;
Kết quả:
L C U ________________ _____________ ______________ kr45 DKK45 €45
Vì vậy, mặc dù NLS_ISO_CURRENCY
tham số có giá trị là DENMARK
, C
phần tử định dạng được trả về DKK
, là ký hiệu tiền tệ ISO thực tế cho Đan Mạch.
Thay đổi từng ký hiệu tiền tệ
Như đã đề cập, bạn có thể đặt từng tham số NLS một cách rõ ràng.
Ví dụ:đã đặt lãnh thổ thành Đan Mạch trong ví dụ trước, giờ đây chúng tôi có thể ghi đè bất kỳ (hoặc tất cả) ký hiệu tiền tệ bằng cách đặt chúng một cách rõ ràng:
ALTER SESSION SET NLS_CURRENCY = '$';
ALTER SESSION SET NLS_ISO_CURRENCY = 'AUSTRALIA';
ALTER SESSION SET NLS_DUAL_CURRENCY = '$';
Kết quả:
Session altered. Session altered. Session altered.
Bây giờ đây là những gì chúng tôi nhận được khi chạy SELECT
trước đó tuyên bố:
SELECT
TO_CHAR(45, 'L99') AS "L",
TO_CHAR(45, 'C99') AS "C",
TO_CHAR(45, 'U99') AS "U"
FROM DUAL;
Kết quả:
L C U ________________ _____________ ________________ $45 AUD45 $45
Vì vậy, mặc dù lãnh thổ của chúng tôi vẫn thuộc Đan Mạch, các ký hiệu tiền tệ của chúng tôi phản ánh một lãnh thổ khác (trong trường hợp này là Úc).
Một điều cần lưu ý khi làm điều này là, bạn có thể gặp phải tình huống trong đó các thông số tiền tệ của bạn không phản ánh các thông số khác, chẳng hạn như NLS_NUMERIC_CHARACTERS
(xác định ký tự nào sẽ sử dụng cho dấu phân tách nhóm và ký tự thập phân).
Ví dụ:
SELECT
TO_CHAR(4599.60, 'L99G999D99') AS "L",
TO_CHAR(4599.60, 'C99G999D99') AS "C",
TO_CHAR(4599.60, 'U99G999D99') AS "U"
FROM DUAL;
Kết quả:
L C U _______________________ ____________________ _______________________ $4.599,60 AUD4.599,60 $4.599,60
Trong trường hợp này, chúng tôi có các ký hiệu tiền tệ của Úc, nhưng dấu phân tách nhóm là một dấu chấm (.
) và ký tự thập phân là dấu phẩy (,
), không phản ánh công ước của Úc (nó phản ánh công ước được Đan Mạch sử dụng). Quy ước của Úc thì ngược lại - dấu phân tách nhóm là dấu phẩy (,
) và ký tự thập phân là một dấu chấm (.
).
Để minh họa điều này, đây là những gì chúng ta nhận được nếu chỉ cần đặt lại lãnh thổ về Úc, sau đó chạy lại tuyên bố:
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;
Kết quả:
L C U _______________________ ____________________ _______________________ $4,599.60 AUD4,599.60 $4,599.60