sql >> Database >  >> RDS >> Oracle

Geen geldige maand bij het uitvoeren van een IN-parameterprocedure met datumwaarde

Uw procedure heeft parameters van het type timestamp . Je geeft eigenlijk parameters door van het type varchar2 in uw oproep. Dat dwingt Oracle om impliciete conversie uit te voeren van de varchar2 parameters naar timestamp met behulp van de NLS_TIMESTAMP_FORMAT . van uw sessie . Dat zal waarschijnlijk anders zijn voor verschillende sessies, dus het is waarschijnlijk dat ten minste sommige sessies een foutmelding krijgen omdat de tekenreeks niet overeenkomt met het formaat van de NLS_TIMESTAMP_FORMAT van die sessie . Je zou veel beter geholpen zijn om een ​​echte tijdstempel door te geven door expliciet to_timestamp aan te roepen of door een tijdstempel letterlijk door te geven.

Uw procedure krijgt dan de timestamp parameters en geef ze door aan de to_date functie. De to_date functie heeft geen parameters van het type timestamp , er zijn alleen parameters van het type varchar2 nodig . Dat dwingt Oracle om nog een impliciete conversie te doen van de timestamp parameters naar varchar2 , opnieuw met behulp van de NLS_TIMESTAMP_FORMAT . van de sessie . Als de sessie NLS_TIMESTAMP_FORMAT . is komt niet overeen met het expliciete formaatmasker in uw to_date bellen, krijgt u een foutmelding of levert de conversie een resultaat op dat u niet verwacht.

Als de kolom in uw tabel daadwerkelijk van het type date is , kunt u direct een date vergelijken naar een timestamp . Er lijkt dus geen reden te zijn om to_date te bellen hier. Op basis van uw voorbeeldgegevens lijkt het er echter op dat de kolom in uw tabel van het type timestamp is in plaats van date zoals je code aangeeft, sinds een date heeft geen fractionele seconden precisie. Als dat het geval is, heeft het nog minder zin om to_date . te bellen in je SELECT statement, aangezien uw parameters eigenlijk van het type timestamp zijn en uw kolom is van het type timestamp . Vergelijk gewoon de timestamp waarden.

Ik vermoed daarom dat je zoiets wilt als

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;

en dat u de procedure wilt aanroepen door actuele tijdstempels door te geven. Letterlijke tijdstempels gebruiken

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

of door expliciet to_timestamp . te bellen

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' ) );

Dat zou alle impliciete typeconversies moeten verwijderen die momenteel plaatsvinden.




  1. Django en PostgreSQL instellen op twee verschillende EC2-instanties

  2. db-objecten exporteren voor versiebeheer

  3. Hoe Django te configureren met pymysql als stuurprogramma?

  4. Op PostgreSQL gebaseerde applicatieprestaties:latentie en verborgen vertragingen