In Oracle Database, the CAST() function converts its argument to a different data type.
More specifically, it lets you convert built-in data types or collection-typed values of one type into another built-in data type or collection type.
Syntax
The syntax goes like this:
CAST({ expr | MULTISET (subquery) } AS type_name
[ DEFAULT return_value ON CONVERSION ERROR ]
[, fmt [, 'nlsparam' ] ])
Example
Here’s an example to demonstrate:
SELECT CAST('10-AUG-30' AS TIMESTAMP)
FROM DUAL;
Result:
10-AUG-30 12.00.00.000000000 AM
Provide a Default Value on Conversion Error
You can use the DEFAULT return_value ON CONVERSION ERROR argument to specify what to return in the event an error occurs when converting the value.
Example:
SELECT CAST(
'Homer' AS NUMBER
DEFAULT '0' ON CONVERSION ERROR
)
FROM DUAL;
Result:
0
Here’s what happens when we remove the DEFAULT return_value ON CONVERSION ERROR argument:
SELECT CAST(
'Homer' AS NUMBER
)
FROM DUAL;
Result:
ORA-01722: invalid number
Specify a Format – The fmt Argument
In this example I use the fmt argument to specify the format of the date in the first argument:
SELECT CAST(
'Friday, 03 September 2021' AS TIMESTAMP,
'Day, DD Month YYYY'
)
FROM DUAL;
Result:
03-SEP-21 12.00.00.000000000 AM
When you Omit the Format
Omitting the format may result in an error, depending on whether the first argument conforms to the session’s default formatting for the resulting data type.
Here’s what happens when I leave out the format argument:
SELECT CAST(
'Friday, 03 September 2021' AS TIMESTAMP
)
FROM DUAL;
Result:
Error report - ORA-01858: a non-numeric character was found where a numeric was expected
In this case, I tried to convert a string to a TIMESTAMP value, but the string didn’t resemble a TIMESTAMP value based on my session’s NLS_TIMESTAMP_FORMAT parameter, and an error occurred.
Here’s the format that my current session uses for TIMESTAMP values:
SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_TIMESTAMP_FORMAT';
Result:
DD-MON-RR HH.MI.SSXFF AM
Let’s change that:
ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'fmDay, DD Month YYYY HH.MI.SSXFF AM';
Result:
Session altered.
And now let’s run the previous conversion again:
SELECT CAST(
'Friday, 03 September 2021' AS TIMESTAMP
)
FROM DUAL;
Result:
Friday, 3 September 2021 12.0.0.000000000 AM
This time there’s no error.
Note that, although I explicitly changed the NLS_TIMESTAMP_FORMAT parameter here, it’s usually better to change the NLS_TERRITORY parameter instead. Changing the NLS_TERRITORY parameter implicitly changes other NLS parameters, such as the date formats, currency symbols, etc.
In any case, as demonstrated above, instead of changing any of the NLS parameters, you can use the fmt argument when calling the function.
The nlsparam Argument
You can use the optional nlsparam argument to specify NLS parameters from within the function.
Example:
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;
Result:
Saturday, 10 August 2030
In this case, I started by setting some of my session’s NLS parameters. Then when I called CAST(), I passed the string in Spanish, and then used the nlsparam argument to specify this.
So, the result is displayed using my session’s NLS parameters, but the actual value that I passed was in Spanish.
More Info
There’s a lot to be mindful of when converting between data types. See Oracle’s documentation for more information on using the CAST() function.