Twoja procedura przyjmuje parametry typu timestamp
. W rzeczywistości przekazujesz parametry typu varchar2
w Twojej rozmowie. To zmusza Oracle do przeprowadzenia niejawnej konwersji varchar2
parametry do timestamp
przy użyciu NLS_TIMESTAMP_FORMAT
sesji . Prawdopodobnie będzie to różne dla różnych sesji, więc jest prawdopodobne, że przynajmniej niektóre sesje otrzymają błąd, ponieważ ciąg nie pasuje do formatu NLS_TIMESTAMP_FORMAT
tej sesji . Będziesz znacznie lepiej obsługiwany, przekazując w rzeczywistym znaczniku czasu, albo jawnie wywołując to_timestamp
lub przekazując literał znacznika czasu.
Twoja procedura następnie pobiera timestamp
parametry i przekaż je do to_date
funkcjonować. to_date
funkcja nie przyjmuje parametrów typu timestamp
, przyjmuje tylko parametry typu varchar2
. To zmusza Oracle do wykonania kolejnej niejawnej konwersji timestamp
parametry do varchar2
, ponownie używając NLS_TIMESTAMP_FORMAT
sesji . Jeśli NLS_TIMESTAMP_FORMAT
sesji nie pasuje do jawnej maski formatu w Twoim to_date
wywołanie, pojawi się błąd lub konwersja zwróci wynik, którego nie oczekujesz.
Jeśli kolumna w Twojej tabeli faktycznie ma typ date
, możesz bezpośrednio porównać date
do timestamp
. Wygląda więc na to, że nie ma żadnego powodu, aby wywoływać to_date
tutaj. Jednak na podstawie przykładowych danych wygląda na to, że kolumna w tabeli ma w rzeczywistości typ timestamp
zamiast date
jak sugeruje twój kod, ponieważ date
nie ma precyzji ułamków sekund. W takim przypadku wywoływanie to_date
ma jeszcze mniej sensu w swoim SELECT
oświadczenie, ponieważ twoje parametry są w rzeczywistości typu timestamp
a Twoja kolumna ma typ timestamp
. Wystarczy porównać timestamp
wartości.
Domyślam się zatem, że chcesz czegoś takiego
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;
i chcesz wywołać procedurę, przekazując rzeczywiste znaczniki czasu. Korzystanie z literałów znaczników czasu
Execute proc1(timestamp '2014-05-05 11:25:00', timestamp '2014-05-05 12:25:00' )
lub jawnie wywołując 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' ) );
Powinno to pozbyć się wszystkich niejawnych konwersji typów, które obecnie mają miejsce.