Oracle
 sql >> база данни >  >> RDS >> Oracle

Функция CAST() в Oracle

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Четене на cob ред по ред с pl\sql

  2. Отървете се от дублиращи се стойности в една колона при избор на две колони

  3. Oracle XML:Пропускане Не съществува възел

  4. Как да преобразите JSON форматираните резултати от заявка в SQLcl (Oracle)

  5. Възможно ли е да се предаде името на таблицата като параметър в Oracle?