Hace un par de dias hubo un problema en el trabajo debido a un consumo de web service,
Nosotros en nuestro proceso de PL-SQL recibimos un xml con una serie de campos.
Entre esos campos se recibe una fecha con formato
'02-AUG-2018'
la cual es una fecha en ingles.
Sucede que cuando queremos utilizar esta fecha con alguna funcion date nos salta este error.
Esto se debe a la configuracion de la base datos, la cual esta en español.
select * from v$nls_parameters a where a.VALUE = 'SPANISH' ;
NLS_LANGUAGE SPANISH
NLS_DATE_LANGUAGE SPANISH
NLS_SORT SPANISH
Una de las primeras soluciones plateadas fue utlizar un alter session y cambiar la configuracion para que pueda trabajar con fechas en ingles.
Esta solucion no era practica debido a que no teniamos permisos para ejecutar un alter session en la base de produccion.
Debido ha esto se plantearon dos soluciones.
Utilizamos esta funcion de forma anidada.
Creamos una serie de expresiones regulares para poder modificar todos los meses que necesitaran una traduccion, esta diseñado para poder controlar tanto meses en ingles como en español.
DECODE
Esta solucion no es tan practica debido a que solo controlara que las fechas que vienen en Ingles se transformen a español.

Nosotros en nuestro proceso de PL-SQL recibimos un xml con una serie de campos.
Entre esos campos se recibe una fecha con formato
'02-AUG-2018'
la cual es una fecha en ingles.
Sucede que cuando queremos utilizar esta fecha con alguna funcion date nos salta este error.
Esto se debe a la configuracion de la base datos, la cual esta en español.
select * from v$nls_parameters a where a.VALUE = 'SPANISH' ;
NLS_LANGUAGE SPANISH
NLS_DATE_LANGUAGE SPANISH
NLS_SORT SPANISH
Una de las primeras soluciones plateadas fue utlizar un alter session y cambiar la configuracion para que pueda trabajar con fechas en ingles.
ALTER SESSION SET NLS_LANGUAGE= 'AMERICAN';
Esta solucion no era practica debido a que no teniamos permisos para ejecutar un alter session en la base de produccion.
Debido ha esto se plantearon dos soluciones.
- REGEXP_REPLACE
- DECODE
Utilizamos esta funcion de forma anidada.
Creamos una serie de expresiones regulares para poder modificar todos los meses que necesitaran una traduccion, esta diseñado para poder controlar tanto meses en ingles como en español.
SELECT TO_DATE(REGEXP_REPLACE
(REGEXP_REPLACE
(REGEXP_REPLACE
(REGEXP_REPLACE('22-JAN-2018','JAN|ENE','01'),
'APR|ABR','04'),
'AUG|AGO','08'),
'DEC|DIC','12'),
'DD-MM-RRRR')
FROM dual;
DECODE
Esta solucion no es tan practica debido a que solo controlara que las fechas que vienen en Ingles se transformen a español.
SELECT '02'||'-'|| --Para el Dia
DECODE('AUG', --Para el mes
'JAN','ENE', 'FEB','FEB', 'MAR','MAR','APR','ABR',
'MAY','MAY', 'JUN','JUN', 'JUL','JUL', 'AUG','AGO',
'SEP','SEP', 'OCT','OCT', 'NOV','NOV', 'DEC','DIC','XXX')||'-'||
'2018' --Para el año
INTO :Fecha
FROM DUAL;




