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.