sql >> Database teknologi >  >> RDS >> Oracle

Ikke en gyldig måned, når der udføres en IN-parameterprocedure med datoværdi

Din procedure tager parametre af typen timestamp . Du sender faktisk parametre af typen varchar2 i dit opkald. Det tvinger Oracle til at udføre implicit konvertering af varchar2 parametre til timestamp ved hjælp af din sessions NLS_TIMESTAMP_FORMAT . Det vil sandsynligvis være forskelligt for forskellige sessioner, så det er sandsynligt, at i det mindste nogle sessioner vil få en fejl, fordi strengen ikke matcher formatet for den sessions NLS_TIMESTAMP_FORMAT . Du ville være meget bedre tjent med at bestå et faktisk tidsstempel, enten ved eksplicit at kalde to_timestamp eller ved at sende et tidsstempel bogstaveligt.

Din procedure tager derefter timestamp parametre og videregive dem til to_date fungere. to_date funktion tager ikke parametre af typen timestamp , det tager kun parametre af typen varchar2 . Det tvinger Oracle til at foretage endnu en implicit konvertering af timestamp parametre til varchar2 , igen ved at bruge sessionens NLS_TIMESTAMP_FORMAT . Hvis sessionens NLS_TIMESTAMP_FORMAT matcher ikke den eksplicitte formatmaske i din to_date ring, får du en fejl, eller konverteringen vil returnere et resultat, som du ikke forventer.

Hvis kolonnen i din tabel faktisk er af typen date , kan du direkte sammenligne en date til et timestamp . Så der ser ikke ud til at være nogen grund til at kalde to_date her. Baseret på dine eksempeldata ser det dog ud til, at kolonnen i din tabel faktisk er af typen timestamp i stedet for date som din kode antyder, da en date har ikke brøkdele af sekunders præcision. Hvis det er tilfældet, giver det endnu mindre mening at kalde to_date i din SELECT sætning, da dine parametre faktisk er af typen timestamp og din kolonne er af typen timestamp . Bare sammenlign timestamp værdier.

Mit gæt er derfor, at du vil have noget lignende

CREATE OR REPLACE PROCEDURE PROC1(
   V_STARTTIME    IN TIMESTAMP ,
   V_ENDTIME      IN TIMESTAMP )
BEGIN
  INSERT INTO TAB1( <<column name>> )
    SELECT COINS 
      FROM TAB2
     WHERE <<timestamp column name>> BETWEEN v_starttime AND v_endtime;
END;

og at du vil kalde proceduren ved at sende faktiske tidsstempler. Brug af tidsstempel bogstaver

Execute proc1(timestamp '2014-05-05 11:25:00', timestamp '2014-05-05 12:25:00' )

eller ved eksplicit at kalde to_timestamp

execute proc1( to_timestamp( '5/05/2014 11:25:00 AM', 'MM/DD/YYYY HH:MI:SS AM' ),
               to_timestamp( '5/05/2014 12:25:00 PM', 'MM/DD/YYYY HH:MI:SS AM' ) );

Det burde slippe af med alle de implicitte typekonverteringer, der i øjeblikket finder sted.




  1. Opret forbindelse til Oracle-databasen i VB

  2. Oracle 11g OFFSET FETCH giver fejl

  3. Kopiér række og alle dens "børn"

  4. jeg skal konfigurere en django og mysql i pycharm IDE