sql >> Base de Datos >  >> RDS >> Oracle

Función CAST() en Oracle

En Oracle Database, el CAST() La función convierte su argumento a un tipo de datos diferente.

Más específicamente, le permite convertir tipos de datos integrados o valores de tipo colección de un tipo en otro tipo de datos integrado o tipo de colección.

Sintaxis

La sintaxis es así:

CAST({ expr | MULTISET (subquery) } AS type_name
  [ DEFAULT return_value ON CONVERSION ERROR ]
  [, fmt [, 'nlsparam' ] ])

Ejemplo

Aquí hay un ejemplo para demostrarlo:

SELECT CAST('10-AUG-30' AS TIMESTAMP)
FROM DUAL;

Resultado:

10-AUG-30 12.00.00.000000000 AM

Proporcionar un valor predeterminado en caso de error de conversión

Puede usar el DEFAULT return_value ON CONVERSION ERROR argumento para especificar qué devolver en caso de que ocurra un error al convertir el valor.

Ejemplo:

SELECT CAST(
    'Homer' AS NUMBER
    DEFAULT '0' ON CONVERSION ERROR
    )
FROM DUAL;

Resultado:

0

Esto es lo que sucede cuando eliminamos el DEFAULT return_value ON CONVERSION ERROR argumento:

SELECT CAST(
    'Homer' AS NUMBER
    )
FROM DUAL;

Resultado:

ORA-01722: invalid number

Especifique un formato:el fmt Argumento

En este ejemplo, uso el fmt argumento para especificar el formato de la fecha en el primer argumento:

SELECT CAST(
    'Friday, 03 September 2021' AS TIMESTAMP,
    'Day, DD Month YYYY'
    )
FROM DUAL;

Resultado:

03-SEP-21 12.00.00.000000000 AM

Cuando omites el formato

Omitir el formato puede generar un error, dependiendo de si el primer argumento se ajusta al formato predeterminado de la sesión para el tipo de datos resultante.

Esto es lo que sucede cuando omito el argumento de formato:

SELECT CAST(
    'Friday, 03 September 2021' AS TIMESTAMP
    )
FROM DUAL;

Resultado:

Error report -
ORA-01858: a non-numeric character was found where a numeric was expected

En este caso, traté de convertir una cadena en un TIMESTAMP valor, pero la cadena no se parecía a un TIMESTAMP valor basado en el NLS_TIMESTAMP_FORMAT de mi sesión parámetro y se produjo un error.

Este es el formato que usa mi sesión actual para TIMESTAMP valores:

SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_TIMESTAMP_FORMAT';

Resultado:

DD-MON-RR HH.MI.SSXFF AM

Cambiemos eso:

ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'fmDay, DD Month YYYY HH.MI.SSXFF AM';

Resultado:

Session altered.

Y ahora ejecutemos la conversión anterior de nuevo:

SELECT CAST(
    'Friday, 03 September 2021' AS TIMESTAMP
    )
FROM DUAL;

Resultado:

Friday, 3 September 2021 12.0.0.000000000 AM

Esta vez no hay error.

Tenga en cuenta que, aunque cambié explícitamente el NLS_TIMESTAMP_FORMAT parámetro aquí, por lo general es mejor cambiar el NLS_TERRITORY parámetro en su lugar. Cambiando el NLS_TERRITORY El parámetro cambia implícitamente otros parámetros NLS, como los formatos de fecha, los símbolos de moneda, etc.

En cualquier caso, como se demostró anteriormente, en lugar de cambiar cualquiera de los parámetros NLS, puede usar el fmt argumento al llamar a la función.

El nlsparam Argumento

Puede usar el nlsparam opcional argumento para especificar parámetros NLS desde dentro de la función.

Ejemplo:

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;

Resultado:

Saturday, 10 August 2030

En este caso, comencé configurando algunos de los parámetros NLS de mi sesión. Luego, cuando llamé a CAST() , pasé la cadena en español y luego usé el nlsparam argumento para especificar esto.

Entonces, el resultado se muestra usando los parámetros NLS de mi sesión, pero el valor real que pasé estaba en español.

Más información

Hay mucho que tener en cuenta al convertir entre tipos de datos. Consulte la documentación de Oracle para obtener más información sobre el uso de CAST() función.