Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Aufrufen der Oracle PL SQL-Funktion aus Excel VBA

Ihre Arbeit mit Datumsangaben ist völlig falsch. Es ist schwierig, einen genauen Ort zu nennen, da es einige potenzielle Orte gibt. Ich werde erklären, was an diesem Codestück falsch ist (es stammt aus Ihrer "Zeile 89"-Anweisung):

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

GTT_DWM_STATS.CLOSINGDATE Datumsformat hat (entsprechend Ihrer DDL-Anweisung). Aber to_date Funktion nimmt einen String als ersten Parameter. An dieser Stelle geht Oracle wie folgt vor:

  • wandelt das Datum implizit in eine Zeichenfolge um (unter Verwendung des Sitzungsformats)
  • dann to_date Funktion versucht, es wieder in ein Datum umzuwandeln, wobei die Zeichenfolge als ein Datum behandelt wird, das in 'DD-MON-YY' geschrieben ist formatieren
  • dann trunc schneidet das Datum ab
  • dann to_char wandelt es wieder in einen String um, und dann vergleichst du deinen String mit dem Datum (schätze ich) FP_BASIC_BD."DATE"
  • wenn FP_BASIC_BD."DATE" ein Datum ist, wandelt Oracle implizit das Ergebnis des Ausdrucks rechts vom Gleichheitszeichen wieder in ein Datum
  • um
  • oder wenn FP_BASIC_BD."DATE" ein String ist, vergleicht Oracle Strings nach den Regeln eines String-Vergleichs.

Was Sie hier brauchen, ist, alle unnötigen Transformationen loszuwerden:

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

Und danach müssen Sie alle anderen Anweisungen, in denen Sie mit Datumsangaben arbeiten, sorgfältig prüfen. Wenn eine Funktion ein Datum als Eingabeparameter verwendet, müssen Sie ein Datum übergeben, wenn eine Funktion einen String akzeptiert - übergeben Sie einen String. Dasselbe gilt für Vergleiche:Vergleichen Sie einen String mit einem String und ein Datum mit einem Datum.