W bazie danych Oracle CAST() funkcja konwertuje swój argument na inny typ danych.
Dokładniej, pozwala konwertować wbudowane typy danych lub wartości typu kolekcji jednego typu na inny wbudowany typ danych lub typ kolekcji.
Składnia
Składnia wygląda tak:
CAST({ expr | MULTISET (subquery) } AS type_name
[ DEFAULT return_value ON CONVERSION ERROR ]
[, fmt [, 'nlsparam' ] ]) Przykład
Oto przykład do zademonstrowania:
SELECT CAST('10-AUG-30' AS TIMESTAMP)
FROM DUAL; Wynik:
10-AUG-30 12.00.00.000000000 AM
Podaj wartość domyślną w przypadku błędu konwersji
Możesz użyć DEFAULT return_value ON CONVERSION ERROR argument określający, co zwrócić w przypadku wystąpienia błędu podczas konwersji wartości.
Przykład:
SELECT CAST(
'Homer' AS NUMBER
DEFAULT '0' ON CONVERSION ERROR
)
FROM DUAL; Wynik:
0
Oto, co się dzieje, gdy usuniemy DEFAULT return_value ON CONVERSION ERROR argument:
SELECT CAST(
'Homer' AS NUMBER
)
FROM DUAL; Wynik:
ORA-01722: invalid number
Określ format — fmt Argument
W tym przykładzie używam fmt argument określający format daty w pierwszym argumencie:
SELECT CAST(
'Friday, 03 September 2021' AS TIMESTAMP,
'Day, DD Month YYYY'
)
FROM DUAL; Wynik:
03-SEP-21 12.00.00.000000000 AM
Gdy pominiesz format
Pominięcie formatu może spowodować błąd, w zależności od tego, czy pierwszy argument jest zgodny z domyślnym formatowaniem sesji dla wynikowego typu danych.
Oto, co się dzieje, gdy pomijam argument formatu:
SELECT CAST(
'Friday, 03 September 2021' AS TIMESTAMP
)
FROM DUAL; Wynik:
Error report - ORA-01858: a non-numeric character was found where a numeric was expected
W tym przypadku próbowałem przekonwertować ciąg na TIMESTAMP wartość, ale ciąg nie przypominał TIMESTAMP wartość na podstawie NLS_TIMESTAMP_FORMAT mojej sesji parametr i wystąpił błąd.
Oto format, którego używa moja bieżąca sesja dla TIMESTAMP wartości:
SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_TIMESTAMP_FORMAT'; Wynik:
DD-MON-RR HH.MI.SSXFF AM
Zmieńmy to:
ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'fmDay, DD Month YYYY HH.MI.SSXFF AM'; Wynik:
Session altered.
A teraz ponownie uruchom poprzednią konwersję:
SELECT CAST(
'Friday, 03 September 2021' AS TIMESTAMP
)
FROM DUAL; Wynik:
Friday, 3 September 2021 12.0.0.000000000 AM
Tym razem nie ma błędu.
Zauważ, że chociaż wyraźnie zmieniłem NLS_TIMESTAMP_FORMAT tutaj parametr, zwykle lepiej jest zmienić NLS_TERRITORY zamiast tego parametr. Zmiana NLS_TERRITORY parametr domyślnie zmienia inne parametry NLS, takie jak formaty daty, symbole walut itp.
W każdym razie, jak pokazano powyżej, zamiast zmieniać którykolwiek z parametrów NLS, możesz użyć fmt argument podczas wywoływania funkcji.
nlsparam Argument
Możesz użyć opcjonalnego nlsparam argument, aby określić parametry NLS z poziomu funkcji.
Przykład:
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; Wynik:
Saturday, 10 August 2030
W tym przypadku zacząłem od ustawienia niektórych parametrów NLS mojej sesji. Potem, kiedy wywołałem CAST() , przekazałem ciąg w języku hiszpańskim, a następnie użyłem nlsparam argument, aby to określić.
Tak więc wynik jest wyświetlany przy użyciu parametrów NLS mojej sesji, ale rzeczywista wartość, którą przekazałem, była w języku hiszpańskim.
Więcej informacji
Podczas konwersji między typami danych należy pamiętać o wielu kwestiach. Zobacz dokumentację Oracle, aby uzyskać więcej informacji na temat korzystania z CAST() funkcja.