Вашата процедура приема параметри от тип timestamp . Вие всъщност предавате параметри от тип varchar2 във вашето обаждане. Това принуждава Oracle да извърши имплицитно преобразуване на varchar2 параметри на timestamp използвайки NLS_TIMESTAMP_FORMAT на вашата сесия . Това вероятно ще бъде различно за различните сесии, така че е вероятно поне някои сесии да получат грешка, защото низът не съвпада с формата на NLS_TIMESTAMP_FORMAT на тази сесия . Ще бъдете много по-добре да подадете действително времево клеймо или чрез изрично извикване на to_timestamp или чрез предаване на литерал на времево клеймо.
След това вашата процедура взема timestamp параметри и ги предава на to_date функция. to_date функцията не приема параметри от тип timestamp , той приема само параметри от тип varchar2 . Това принуждава Oracle да направи друго имплицитно преобразуване на timestamp параметри към varchar2 , отново използвайки NLS_TIMESTAMP_FORMAT на сесията . Ако NLS_TIMESTAMP_FORMAT на сесията не съвпада с изричната маска за формат във вашия to_date повикване, ще получите грешка или преобразуването ще върне резултат, който не очаквате.
Ако колоната във вашата таблица всъщност е от тип date , можете директно да сравните date към timestamp . Така че изглежда няма причина да се извиква to_date тук. Въз основа на вашите примерни данни обаче изглежда, че колоната във вашата таблица всъщност е от тип timestamp вместо date както предполага вашият код, от date няма дробни секунди с точност. Ако случаят е такъв, има още по-малко смисъл да се извиква to_date във вашия SELECT тъй като вашите параметри всъщност са от тип timestamp и вашата колона е от тип timestamp . Просто сравнете timestamp стойности.
Следователно моето предположение е, че искате нещо като
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;
и че искате да извикате процедурата чрез предаване на действителни времеви отпечатъци. Използване на литерали за клеймо за време
Execute proc1(timestamp '2014-05-05 11:25:00', timestamp '2014-05-05 12:25:00' )
или чрез изрично извикване на 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' ) );
Това трябва да премахне всички неявни преобразувания на типове, които се извършват в момента.