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.