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

Hàm CAST () trong Oracle

Trong Cơ sở dữ liệu Oracle, CAST() hàm chuyển đổi đối số của nó thành một kiểu dữ liệu khác.

Cụ thể hơn, nó cho phép bạn chuyển đổi các kiểu dữ liệu tích hợp sẵn hoặc các giá trị được định kiểu tập hợp của một loại thành một kiểu dữ liệu hoặc kiểu tập hợp được tích hợp sẵn khác.

Cú pháp

Cú pháp như sau:

CAST({ expr | MULTISET (subquery) } AS type_name
  [ DEFAULT return_value ON CONVERSION ERROR ]
  [, fmt [, 'nlsparam' ] ])

Ví dụ

Dưới đây là một ví dụ để chứng minh:

SELECT CAST('10-AUG-30' AS TIMESTAMP)
FROM DUAL;

Kết quả:

10-AUG-30 12.00.00.000000000 AM

Cung cấp Giá trị Mặc định do Lỗi Chuyển đổi

Bạn có thể sử dụng DEFAULT return_value ON CONVERSION ERROR để chỉ định những gì sẽ trả về trong trường hợp xảy ra lỗi khi chuyển đổi giá trị.

Ví dụ:

SELECT CAST(
    'Homer' AS NUMBER
    DEFAULT '0' ON CONVERSION ERROR
    )
FROM DUAL;

Kết quả:

0

Đây là những gì sẽ xảy ra khi chúng tôi xóa DEFAULT return_value ON CONVERSION ERROR đối số:

SELECT CAST(
    'Homer' AS NUMBER
    )
FROM DUAL;

Kết quả:

ORA-01722: invalid number

Chỉ định một định dạng - fmt Đối số

Trong ví dụ này, tôi sử dụng fmt đối số để chỉ định định dạng của ngày trong đối số đầu tiên:

SELECT CAST(
    'Friday, 03 September 2021' AS TIMESTAMP,
    'Day, DD Month YYYY'
    )
FROM DUAL;

Kết quả:

03-SEP-21 12.00.00.000000000 AM

Khi bạn Bỏ qua Định dạng

Việc bỏ qua định dạng có thể dẫn đến lỗi, tùy thuộc vào việc đối số đầu tiên có tuân theo định dạng mặc định của phiên cho kiểu dữ liệu kết quả hay không.

Đây là những gì sẽ xảy ra khi tôi bỏ qua đối số định dạng:

SELECT CAST(
    'Friday, 03 September 2021' AS TIMESTAMP
    )
FROM DUAL;

Kết quả:

Error report -
ORA-01858: a non-numeric character was found where a numeric was expected

Trong trường hợp này, tôi đã cố gắng chuyển đổi một chuỗi thành TIMESTAMP giá trị, nhưng chuỗi không giống với TIMESTAMP giá trị dựa trên NLS_TIMESTAMP_FORMAT của phiên của tôi và đã xảy ra lỗi.

Đây là định dạng mà phiên hiện tại của tôi sử dụng cho TIMESTAMP giá trị:

SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_TIMESTAMP_FORMAT';

Kết quả:

DD-MON-RR HH.MI.SSXFF AM

Hãy thay đổi điều đó:

ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'fmDay, DD Month YYYY HH.MI.SSXFF AM';

Kết quả:

Session altered.

Và bây giờ hãy chạy lại chuyển đổi trước đó:

SELECT CAST(
    'Friday, 03 September 2021' AS TIMESTAMP
    )
FROM DUAL;

Kết quả:

Friday, 3 September 2021 12.0.0.000000000 AM

Lần này không có lỗi.

Lưu ý rằng, mặc dù tôi đã thay đổi rõ ràng NLS_TIMESTAMP_FORMAT ở đây, thường tốt hơn là thay đổi NLS_TERRITORY tham số thay thế. Thay đổi NLS_TERRITORY tham số thay đổi hoàn toàn các tham số NLS khác, chẳng hạn như định dạng ngày tháng, ký hiệu tiền tệ, v.v.

Trong mọi trường hợp, như đã trình bày ở trên, thay vì thay đổi bất kỳ tham số NLS nào, bạn có thể sử dụng fmt đối số khi gọi hàm.

nlsparam Đối số

Bạn có thể sử dụng nlsparam tùy chọn đối số để chỉ định các tham số NLS từ bên trong hàm.

Ví dụ:

ALTER SESSION SET NLS_TERRITORY = 'Australia';
ALTER SESSION SET NLS_DATE_LANGUAGE = 'English';
ALTER SESSION SET NLS_DATE_FORMAT = 'fmDay, DD Month YYYY';
SELECT 
    CAST(
    'sábado, 10 agosto 30' AS DATE,
    'Day, DD Month RR',
    'NLS_DATE_LANGUAGE = SPANISH'
    )
FROM DUAL;

Kết quả:

Saturday, 10 August 2030

Trong trường hợp này, tôi bắt đầu bằng cách đặt một số thông số NLS cho phiên của mình. Sau đó, khi tôi gọi CAST() , Tôi đã chuyển chuỗi bằng tiếng Tây Ban Nha và sau đó sử dụng nlsparam đối số để xác định điều này.

Vì vậy, kết quả được hiển thị bằng cách sử dụng các tham số NLS của phiên của tôi, nhưng giá trị thực tế mà tôi đã chuyển là bằng tiếng Tây Ban Nha.

Thông tin thêm

Có rất nhiều điều cần lưu ý khi chuyển đổi giữa các loại dữ liệu. Xem tài liệu của Oracle để biết thêm thông tin về cách sử dụng CAST() chức năng.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PL / SQL:làm cách nào để nhắc người dùng nhập vào một thủ tục?

  2. Zip sử dụng Thủ tục lưu trữ Oracle

  3. Oracle 10g Múi giờ nhầm lẫn

  4. Oracle - Tôi đang sử dụng tệp TNS Names nào?

  5. Bán phá giá khối dữ liệu