В 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()
функция.