Estudiante Universidad de Guayaquil Ingeniería en Sistemas Dirigente estudiantil #OasisSiempreOasis "Compartir es aprender, es mejorar como sociedad"

lunes, 6 de agosto de 2018

Fecha Ingles - Español Oracle - ORA-01843

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.

     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 
REGEXP_REPLACE  
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;
Share:

PENSAMIENTOS

Buscar este blog

Con la tecnología de Blogger.

Datos personales

Fecha Ingles - Español Oracle - ORA-01843

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 x...