Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Funkcja CAST() w Oracle

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. co to jest oracle EBS R12?

  2. LAST_DAY() Funkcja w Oracle

  3. Czy w ORACLE istnieje sposób na połączenie wielu wierszy w jeden, przy użyciu dwóch tabel, w których końcowe wartości są oddzielone przecinkami?

  4. Jak edytować procedurę składowaną w Oracle SQL Developer?

  5. UPSERT do tabeli z dynamiczną nazwą tabeli