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.