Khi bạn sử dụng TO_CHAR()
chức năng định dạng một số trong Oracle, bạn sử dụng mô hình định dạng để xác định cách định dạng số đó.
Ví dụ:bạn có thể định dạng một số như 12,345.00
hoặc như 12.345,00
, tùy thuộc vào ngôn ngữ của bạn.
Mô hình định dạng có thể bao gồm G
hoặc D
định dạng các phần tử để thêm dấu phẩy vào một số. Cái nào bạn sử dụng tùy thuộc vào việc bạn muốn dấu phẩy làm dấu phân cách hàng nghìn hay ở dạng ký tự thập phân.
Ngoài ra, bạn có thể sử dụng một ký tự dấu phẩy thực (,
) nếu bạn thích, mặc dù phương pháp này không nhận biết ngôn ngữ như G
và D
các yếu tố định dạng là.
G
và D
Phần tử định dạng
Đây là một ví dụ để chứng minh G
và D
phần tử định dạng:
SELECT TO_CHAR(12345, 'fm99G999D00')
FROM DUAL;
Kết quả:
12,345.00
Trong trường hợp này, dấu phân tách nhóm xuất ra dấu phẩy và ký tự thập phân xuất ra dấu chấm. Đó là vì NLS_TERRITORY
của phiên hiện tại của tôi tham số được đặt thành Australia
.
Đây là những gì sẽ xảy ra nếu tôi thay đổi NLS_TERRITORY
của mình tham số thành Germany
:
ALTER SESSION SET NLS_TERRITORY = 'Germany';
SELECT TO_CHAR(12345, 'fm99G999D00')
FROM DUAL;
Kết quả:
12,345.00
Bây giờ dấu phẩy đang được sử dụng cho ký tự thập phân.
Như một giải thích nhanh về mô hình định dạng trên:
-
fm
công cụ sửa đổi định dạng ngăn chặn bất kỳ phần đệm nào có thể được áp dụng cho kết quả. -
9
các ký tự đại diện cho số. -
0
ký tự đại diện cho các số mà không chặn bất kỳ số không ở đầu hoặc ở cuối.
Dưới đây là danh sách đầy đủ các phần tử định dạng số mà bạn có thể sử dụng làm tài liệu tham khảo nhanh.
T he NLS_NUMERIC_CHARACTERS
Tham số
Khi chúng tôi đặt NLS_TERRITORY
(như trong ví dụ trước), điều này mặc nhiên đặt một loạt các tham số khác, bao gồm NLS_NUMERIC_CHARACTERS
tham số.
T he NLS_NUMERIC_CHARACTERS
tham số xác định ký tự nào được sử dụng cho dấu phân tách nhóm và ký tự thập phân.
Chúng tôi có thể truy vấn V$NLS_PARAMETERS
xem những ký tự nào đang được sử dụng cho dấu phân tách nhóm và ký tự thập phân:
SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_NUMERIC_CHARACTERS';
Kết quả:
,.
Ở đây chúng ta thấy rằng ký tự thập phân được biểu thị bằng dấu phẩy và dấu phân tách nhóm được biểu thị bằng dấu chấm.
Bạn có thể thay đổi giá trị của NLS_NUMERIC_CHARACTERS
trực tiếp nếu bạn muốn (tức là không thay đổi NLS_TERRITORY
tham số).
ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '.,';
SELECT TO_CHAR(12345, 'fm99G999D00')
FROM DUAL;
Kết quả:
12,345.00
Nhưng có lẽ bạn nên tránh làm điều này, vì nó gây ra sự ngắt kết nối giữa các tham số NLS. Các thông số NLS của bạn không còn phản ánh các giá trị mặc định cho lãnh thổ hiện tại. Trừ khi bạn có lý do chính đáng để không làm như vậy, thông thường tốt hơn là bạn nên thay đổi NLS_TERRITORY
tham số cho lãnh thổ có liên quan, để các tham số khác cũng có thể được cập nhật thành tham số mặc định cho lãnh thổ mới.
'nlsparam'
Đối số
Một điều tôi nên đề cập là T0_CHAR()
hàm chấp nhận đối số thứ ba cho phép bạn tạm thời đặt các tham số NLS khác nhau, bao gồm NLS_NUMERIC_CHARACTERS
tham số. Khi bạn thực hiện việc này ở cấp hàm, nó không thay đổi giá trị của các tham số đó cho phiên hiện tại.
Đây là một ví dụ:
ALTER SESSION SET NLS_TERRITORY = 'Germany';
SELECT
TO_CHAR(12345, 'fm99G999D00') AS "r1",
TO_CHAR(
12345, 'fm99G999D00',
'NLS_NUMERIC_CHARACTERS = ''.,'''
) AS "r2",
TO_CHAR(12345, 'fm99G999D00') AS "r3"
FROM DUAL;
Kết quả:
r1 r2 r3 ____________ ____________ ____________ 12.345,00 12,345.00 12.345,00
Tại đây, tôi đặt lãnh thổ của phiên thành Đức, sau đó gọi là TO_CHAR()
ba lần.
- Cuộc gọi đầu tiên sử dụng các tham số NLS của phiên. Điều này có nghĩa là dấu phân tách nhóm mặc định là một dấu chấm.
- Trong cuộc gọi thứ hai, tôi đặt
NLS_NUMERIC_CHARACTERS
của riêng mình một cách rõ ràng tham số từ bên trong hàm. Trong trường hợp này, tôi đặt dấu phân tách nhóm thành dấu phẩy. Việc làm này không ảnh hưởng đến các thông số NLS trong phiên của tôi, như đã thấy trong lần gọi thứ ba. - Cuộc gọi thứ ba sử dụng các tham số NLS của phiên, giống như cuộc gọi đầu tiên. Như chúng ta có thể thấy, dấu phân tách nhóm và ký tự thập phân không bị ảnh hưởng bởi thay đổi (tạm thời) mà chúng tôi đã thực hiện trong lần gọi thứ hai.
Dấu phẩy được mã hóa cứng
Một cách khác để thêm dấu phẩy vào một số là mã hóa nó vào mô hình định dạng của bạn.
Ví dụ:
ALTER SESSION SET NLS_TERRITORY = 'Germany';
SELECT TO_CHAR(12345, 'fm99,999.00')
FROM DUAL;
Kết quả:
12,345.00
Trong trường hợp này, tôi đã mã hóa cứng dấu phẩy và dấu chấm. Thực hiện việc này sẽ bỏ qua dấu phân tách nhóm được đặt trong NLS_NUMERIC_CHARACTERS
tham số.
Nhiều dấu phẩy
Bạn có thể có nhiều dấu phẩy và / hoặc dấu phân tách nhóm trong một mô hình định dạng.
Ví dụ:
ALTER SESSION SET NLS_TERRITORY = 'Australia';
SELECT TO_CHAR(123456789, 'fm999G999G999D00')
FROM DUAL;
Kết quả:
123,456,789.00
Vị trí Dấu phẩy Không hợp lệ
Dấu phẩy hoặc dấu phân tách nhóm không được xuất hiện ở bên phải ký tự thập phân hoặc dấu chấm trong mô hình định dạng số.
SELECT TO_CHAR(12345, 'fm99D999G00')
FROM DUAL;
Kết quả:
Error report - ORA-01481: invalid number format model