Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Cách thay đổi ký hiệu tiền tệ trong phiên của bạn trong Oracle

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ệ cho L phần tử định dạng số.
  • NLS_ISO_CURRENCY xác định những gì sẽ sử dụng cho C phần tử định dạng.
  • NLS_DUAL_CURRENCY chỉ định những gì sẽ sử dụng cho U 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    

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-01097

  2. CRS 11.2.0

  3. Làm thế nào để gọi một hàm Oracle từ Hibernate với một tham số trả về?

  4. Làm thế nào để xác định một kích hoạt ON COMMIT trong Oracle?

  5. TNSPING OK nhưng sqlplus cho ORA-12154?