Oracle
 sql >> Database >  >> RDS >> Oracle

CAST() Funzione in Oracle

In Oracle Database, il CAST() la funzione converte il suo argomento in un tipo di dati diverso.

Più specificamente, ti consente di convertire tipi di dati incorporati o valori tipizzati da raccolta di un tipo in un altro tipo di dati integrato o tipo di raccolta.

Sintassi

La sintassi è questa:

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

Esempio

Ecco un esempio da dimostrare:

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

Risultato:

10-AUG-30 12.00.00.000000000 AM

Fornisci un valore predefinito in caso di errore di conversione

Puoi utilizzare il DEFAULT return_value ON CONVERSION ERROR argomento per specificare cosa restituire nel caso in cui si verifichi un errore durante la conversione del valore.

Esempio:

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

Risultato:

0

Ecco cosa succede quando rimuoviamo il DEFAULT return_value ON CONVERSION ERROR argomento:

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

Risultato:

ORA-01722: invalid number

Specifica un formato:fmt Argomento

In questo esempio utilizzo fmt argomento per specificare il formato della data nel primo argomento:

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

Risultato:

03-SEP-21 12.00.00.000000000 AM

Quando ometti il ​​formato

L'omissione del formato può causare un errore, a seconda che il primo argomento sia conforme alla formattazione predefinita della sessione per il tipo di dati risultante.

Ecco cosa succede quando tralascio l'argomento format:

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

Risultato:

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

In questo caso, ho provato a convertire una stringa in un TIMESTAMP valore, ma la stringa non assomigliava a un TIMESTAMP valore basato sul NLS_TIMESTAMP_FORMAT della mia sessione parametro e si è verificato un errore.

Ecco il formato utilizzato dalla mia sessione corrente per TIMESTAMP valori:

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

Risultato:

DD-MON-RR HH.MI.SSXFF AM

Cambiamo questo:

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

Risultato:

Session altered.

E ora eseguiamo di nuovo la conversione precedente:

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

Risultato:

Friday, 3 September 2021 12.0.0.000000000 AM

Questa volta non ci sono errori.

Nota che, anche se ho cambiato esplicitamente NLS_TIMESTAMP_FORMAT parametro qui, di solito è meglio cambiare il NLS_TERRITORY parametro invece. Modifica del NLS_TERRITORY parametro modifica implicitamente altri parametri NLS, come i formati della data, i simboli di valuta, ecc.

In ogni caso, come mostrato sopra, invece di modificare uno qualsiasi dei parametri NLS, puoi utilizzare il fmt argomento quando si chiama la funzione.

Il nlsparam Argomento

Puoi utilizzare il nlsparam facoltativo argomento per specificare i parametri NLS dall'interno della funzione.

Esempio:

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;

Risultato:

Saturday, 10 August 2030

In questo caso, ho iniziato impostando alcuni dei parametri NLS della mia sessione. Poi quando ho chiamato CAST() , ho passato la stringa in spagnolo, quindi ho utilizzato nlsparam argomento per specificarlo.

Quindi, il risultato viene visualizzato utilizzando i parametri NLS della mia sessione, ma il valore effettivo che ho passato era in spagnolo.

Maggiori informazioni

C'è molto di cui prestare attenzione durante la conversione tra tipi di dati. Consulta la documentazione di Oracle per ulteriori informazioni sull'utilizzo di CAST() funzione.