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.