sql >> Databasteknik >  >> RDS >> Oracle

Anropa Oracle PL SQL-funktion från Excel VBA

Ditt arbete med datum är helt felaktigt. Det är svårt att ange exakt plats eftersom det finns några potentiella platser. Jag ska förklara vad som är fel med denna kodbit (den är hämtad från din "rad 89"-sats):

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

GTT_DWM_STATS.CLOSINGDATE har datumformat (enligt din DDL-sats). Men to_date funktion tar en sträng som en första parameter. På den här platsen gör Oracle följande:

  • konverterar implicit datum till sträng (med sessionens format)
  • sedan to_date funktionen försöker konvertera det tillbaka till ett datum och behandlar strängen som ett datum skrivet i 'DD-MON-YY' format
  • sedan trunc trunkerar datumet
  • sedan to_char konverterar den igen till en sträng, och sedan jämför du din sträng med datumet (antar jag) FP_BASIC_BD."DATE"
  • om FP_BASIC_BD."DATE" är ett datum konverterar Oracle implicit resultatet av uttrycket till höger om likhetstecken igen till ett datum
  • eller om FP_BASIC_BD."DATE" är en sträng, jämför Oracle strängar enligt reglerna för en strängjämförelse.

Vad du behöver här är att bli av med alla onödiga transformationer:

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

Och efter det måste du noga kontrollera alla andra påståenden där du arbetar med datum. Om en funktion tar ett datum som indataparameter måste du skicka ett datum, om en funktion tar en sträng - skicka en sträng. Samma sak med jämförelser:jämför en sträng med en sträng och ett datum med ett datum.




  1. ärendeutlåtande i lagrat förfarande

  2. Hur TAN() fungerar i MariaDB

  3. Hur höjer man undantag i PL/SQL?

  4. De bästa ETL-verktygen för att migrera till PostgreSQL