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.