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

Llamar a la función Oracle PL SQL desde Excel VBA

Su trabajo con las fechas es totalmente incorrecto. Es difícil señalar el lugar exacto porque hay algunos lugares potenciales. Explicaré lo que está mal con este fragmento de código (se tomó de su declaración de "línea 89"):

... FP_BASIC_BD."DATE">=TO_CHAR(TRUNC(TO_DATE(GTT_DWM_STATS.CLOSINGDATE,'DD-MON-YY'), 'IW'),'DD-MON-YY') ...

GTT_DWM_STATS.CLOSINGDATE tiene formato de fecha (según su declaración DDL). Pero to_date La función toma una cadena como primer parámetro. En este lugar, Oracle hace lo siguiente:

  • convierte implícitamente la fecha en una cadena (usando el formato de la sesión)
  • entonces to_date La función intenta volver a convertirlo en una fecha, tratando la cadena como una fecha escrita en 'DD-MON-YY' formato
  • entonces trunc trunca la fecha
  • luego to_char lo convierte nuevamente en una cadena, y luego compara su cadena con la fecha (supongo) FP_BASIC_BD."DATE"
  • si FP_BASIC_BD."DATE" es una fecha, Oracle convierte implícitamente el resultado de la expresión a la derecha del signo igual nuevamente en una fecha
  • o si FP_BASIC_BD."DATE" es una cadena, Oracle compara las cadenas de acuerdo con las reglas de una comparación de cadenas.

Lo que necesita aquí es deshacerse de todas las transformaciones innecesarias:

FP_BASIC_BD."DATE" >= TRUNC(GTT_DWM_STATS.CLOSINGDATE, 'IW')

Y después de eso, debe verificar cuidadosamente todas las demás declaraciones en las que está trabajando con fechas. Si una función toma una fecha como parámetro de entrada, debe pasar una fecha, si una función toma una cadena, pase una cadena. Lo mismo con las comparaciones:compare una cadena con una cadena y una fecha con una fecha.