sql >> Databáze >  >> RDS >> Oracle

Funkce CAST() v Oracle

V databázi Oracle je to CAST() funkce převede svůj argument na jiný datový typ.

Konkrétněji vám umožňuje převádět vestavěné datové typy nebo hodnoty typu kolekce jednoho typu na jiný vestavěný datový typ nebo typ kolekce.

Syntaxe

Syntaxe vypadá takto:

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

Příklad

Zde je příklad k demonstraci:

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

Výsledek:

10-AUG-30 12.00.00.000000000 AM

Zadejte výchozí hodnotu při chybě konverze

Můžete použít DEFAULT return_value ON CONVERSION ERROR argument k určení, co se má vrátit v případě, že při převodu hodnoty dojde k chybě.

Příklad:

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

Výsledek:

0

Co se stane, když odebereme DEFAULT return_value ON CONVERSION ERROR argument:

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

Výsledek:

ORA-01722: invalid number

Určete formát – fmt Argument

V tomto příkladu používám fmt argument k určení formátu data v prvním argumentu:

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

Výsledek:

03-SEP-21 12.00.00.000000000 AM

Když vynecháte formát

Vynechání formátu může vést k chybě v závislosti na tom, zda první argument odpovídá výchozímu formátování relace pro výsledný datový typ.

Zde je to, co se stane, když vynechám argument formátu:

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

Výsledek:

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

V tomto případě jsem se pokusil převést řetězec na TIMESTAMP hodnotu, ale řetězec se nepodobal TIMESTAMP hodnotu na základě NLS_TIMESTAMP_FORMAT mé relace parametr a došlo k chybě.

Zde je formát, který moje aktuální relace používá pro TIMESTAMP hodnoty:

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

Výsledek:

DD-MON-RR HH.MI.SSXFF AM

Pojďme to změnit:

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

Výsledek:

Session altered.

A nyní spusťte znovu předchozí konverzi:

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

Výsledek:

Friday, 3 September 2021 12.0.0.000000000 AM

Tentokrát bez chyby.

Všimněte si, že ačkoli jsem výslovně změnil NLS_TIMESTAMP_FORMAT zde, je obvykle lepší změnit NLS_TERRITORY parametr místo toho. Změna NLS_TERRITORY parametr implicitně mění další parametry NLS, jako jsou formáty data, symboly měny atd.

V každém případě, jak je ukázáno výše, místo změny kteréhokoli z parametrů NLS můžete použít fmt argument při volání funkce.

nlsparam Argument

Můžete použít volitelný nlsparam argument pro zadání parametrů NLS z funkce.

Příklad:

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;

Výsledek:

Saturday, 10 August 2030

V tomto případě jsem začal nastavením některých parametrů NLS mé relace. Když jsem pak zavolal CAST() , předal jsem řetězec ve španělštině a poté jsem použil nlsparam argument, který to specifikuje.

Výsledek je tedy zobrazen pomocí parametrů NLS mé relace, ale skutečná hodnota, kterou jsem předal, byla ve španělštině.

Další informace

Při převodu mezi datovými typy je třeba mít na paměti mnoho. Další informace o použití CAST() najdete v dokumentaci Oracle funkce.


  1. MyCLI – MySQL/MariaDB klient s automatickým dokončováním a zvýrazněním syntaxe

  2. Přesunutí databáze MariaDB do šifrovaných a nešifrovaných států

  3. V odkazované tabulce nejsou žádné primární nebo kandidátské klíče, které by odpovídaly seznamu odkazujících sloupců v cizím klíči

  4. Volání uložené procedury Oracle s výstupním parametrem ze serveru SQL