В Oracle Database, CAST() функцията преобразува своя аргумент в различен тип данни.
По-конкретно, той ви позволява да конвертирате вградени типове данни или въведени от колекция стойности от един тип в друг вграден тип данни или тип колекция.
Синтаксис
Синтаксисът е така:
CAST({ expr | MULTISET (subquery) } AS type_name
[ DEFAULT return_value ON CONVERSION ERROR ]
[, fmt [, 'nlsparam' ] ]) Пример
Ето пример за демонстрация:
SELECT CAST('10-AUG-30' AS TIMESTAMP)
FROM DUAL; Резултат:
10-AUG-30 12.00.00.000000000 AM
Предоставете стойност по подразбиране при грешка при преобразуване
Можете да използвате DEFAULT return_value ON CONVERSION ERROR аргумент, за да укажете какво да върнете в случай, че възникне грешка при преобразуване на стойността.
Пример:
SELECT CAST(
'Homer' AS NUMBER
DEFAULT '0' ON CONVERSION ERROR
)
FROM DUAL; Резултат:
0
Ето какво се случва, когато премахнем DEFAULT return_value ON CONVERSION ERROR аргумент:
SELECT CAST(
'Homer' AS NUMBER
)
FROM DUAL; Резултат:
ORA-01722: invalid number
Посочете формат – fmt Аргумент
В този пример използвам fmt аргумент, за да посочите формата на датата в първия аргумент:
SELECT CAST(
'Friday, 03 September 2021' AS TIMESTAMP,
'Day, DD Month YYYY'
)
FROM DUAL; Резултат:
03-SEP-21 12.00.00.000000000 AM
Когато пропуснете формата
Пропускането на формата може да доведе до грешка, в зависимост от това дали първият аргумент съответства на форматирането по подразбиране на сесията за получения тип данни.
Ето какво се случва, когато пропусна аргумента format:
SELECT CAST(
'Friday, 03 September 2021' AS TIMESTAMP
)
FROM DUAL; Резултат:
Error report - ORA-01858: a non-numeric character was found where a numeric was expected
В този случай се опитах да конвертирам низ в TIMESTAMP стойност, но низът не приличаше на TIMESTAMP стойност въз основа на NLS_TIMESTAMP_FORMAT на моята сесия параметър и възникна грешка.
Ето формата, който текущата ми сесия използва за TIMESTAMP стойности:
SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_TIMESTAMP_FORMAT'; Резултат:
DD-MON-RR HH.MI.SSXFF AM
Нека променим това:
ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'fmDay, DD Month YYYY HH.MI.SSXFF AM'; Резултат:
Session altered.
И сега нека стартираме предишното преобразуване отново:
SELECT CAST(
'Friday, 03 September 2021' AS TIMESTAMP
)
FROM DUAL; Резултат:
Friday, 3 September 2021 12.0.0.000000000 AM
Този път няма грешка.
Имайте предвид, че въпреки че изрично промених NLS_TIMESTAMP_FORMAT параметър тук, обикновено е по-добре да промените NLS_TERRITORY параметър вместо това. Промяна на NLS_TERRITORY параметър имплицитно променя други параметри на NLS, като форматите на датите, символите на валутата и т.н.
Във всеки случай, както е показано по-горе, вместо да променяте някой от NLS параметрите, можете да използвате fmt аргумент при извикване на функцията.
nlsparam Аргумент
Можете да използвате незадължителния nlsparam аргумент за определяне на NLS параметри от функцията.
Пример:
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; Резултат:
Saturday, 10 August 2030
В този случай започнах с настройка на някои от NLS параметрите на моята сесия. След това, когато извиках CAST() , предадох низа на испански и след това използвах nlsparam аргумент за уточняване на това.
И така, резултатът се показва с помощта на NLS параметрите на моята сесия, но действителната стойност, която предадох, беше на испански.
Повече информация
Има много неща, които трябва да имате предвид, когато преобразувате между типове данни. Вижте документацията на Oracle за повече информация относно използването на CAST() функция.