I Oracle Database, CAST()
funktion konverterar sitt argument till en annan datatyp.
Mer specifikt låter den dig konvertera inbyggda datatyper eller samlingstypade värden av en typ till en annan inbyggd datatyp eller insamlingstyp.
Syntax
Syntaxen ser ut så här:
CAST({ expr | MULTISET (subquery) } AS type_name
[ DEFAULT return_value ON CONVERSION ERROR ]
[, fmt [, 'nlsparam' ] ])
Exempel
Här är ett exempel att visa:
SELECT CAST('10-AUG-30' AS TIMESTAMP)
FROM DUAL;
Resultat:
10-AUG-30 12.00.00.000000000 AM
Ange ett standardvärde vid konverteringsfel
Du kan använda DEFAULT return_value ON CONVERSION ERROR
argument för att ange vad som ska returneras om ett fel uppstår vid konvertering av värdet.
Exempel:
SELECT CAST(
'Homer' AS NUMBER
DEFAULT '0' ON CONVERSION ERROR
)
FROM DUAL;
Resultat:
0
Här är vad som händer när vi tar bort DEFAULT return_value ON CONVERSION ERROR
argument:
SELECT CAST(
'Homer' AS NUMBER
)
FROM DUAL;
Resultat:
ORA-01722: invalid number
Ange ett format – fmt
Argument
I det här exemplet använder jag fmt
argument för att ange formatet för datumet i det första argumentet:
SELECT CAST(
'Friday, 03 September 2021' AS TIMESTAMP,
'Day, DD Month YYYY'
)
FROM DUAL;
Resultat:
03-SEP-21 12.00.00.000000000 AM
När du utelämnar formatet
Att utelämna formatet kan resultera i ett fel, beroende på om det första argumentet överensstämmer med sessionens standardformatering för den resulterande datatypen.
Så här händer när jag utelämnar formatargumentet:
SELECT CAST(
'Friday, 03 September 2021' AS TIMESTAMP
)
FROM DUAL;
Resultat:
Error report - ORA-01858: a non-numeric character was found where a numeric was expected
I det här fallet försökte jag konvertera en sträng till en TIMESTAMP
värde, men strängen liknade inte en TIMESTAMP
värde baserat på min sessions NLS_TIMESTAMP_FORMAT
parameter och ett fel uppstod.
Här är formatet som min nuvarande session använder för TIMESTAMP
värden:
SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_TIMESTAMP_FORMAT';
Resultat:
DD-MON-RR HH.MI.SSXFF AM
Låt oss ändra det:
ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'fmDay, DD Month YYYY HH.MI.SSXFF AM';
Resultat:
Session altered.
Och låt oss nu köra den föregående konverteringen igen:
SELECT CAST(
'Friday, 03 September 2021' AS TIMESTAMP
)
FROM DUAL;
Resultat:
Friday, 3 September 2021 12.0.0.000000000 AM
Den här gången är det inget fel.
Observera att även om jag uttryckligen ändrade NLS_TIMESTAMP_FORMAT
parameter här är det vanligtvis bättre att ändra NLS_TERRITORY
parameter istället. Ändra NLS_TERRITORY
parametern ändrar implicit andra NLS-parametrar, såsom datumformat, valutasymboler, etc.
I alla fall, som visats ovan, istället för att ändra någon av NLS-parametrarna, kan du använda fmt
argument när funktionen anropas.
nlsparam
Argument
Du kan använda den valfria nlsparam
argument för att specificera NLS-parametrar inifrån funktionen.
Exempel:
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;
Resultat:
Saturday, 10 August 2030
I det här fallet började jag med att ställa in några av min sessions NLS-parametrar. Sedan när jag anropade CAST()
, jag skickade strängen på spanska och använde sedan nlsparam
argument för att specificera detta.
Så resultatet visas med min sessions NLS-parametrar, men det faktiska värdet som jag klarade var på spanska.
Mer information
Det finns mycket att tänka på när du konverterar mellan datatyper. Se Oracles dokumentation för mer information om hur du använder CAST()
funktion.