Váš postup přebírá parametry typu timestamp
. Ve skutečnosti předáváte parametry typu varchar2
ve vašem hovoru. To přinutí Oracle provést implicitní konverzi varchar2
parametry na timestamp
pomocí NLS_TIMESTAMP_FORMAT
vaší relace . To se pravděpodobně bude u různých relací lišit, takže je pravděpodobné, že alespoň u některých relací dojde k chybě, protože řetězec neodpovídá formátu NLS_TIMESTAMP_FORMAT
dané relace. . Mnohem lépe by vám posloužilo předání skutečného časového razítka buď explicitním voláním to_timestamp
nebo předáním literálu časového razítka.
Váš postup pak vezme timestamp
parametry a předat je to_date
funkce. to_date
funkce nepřebírá parametry typu timestamp
, přebírá pouze parametry typu varchar2
. To donutí Oracle provést další implicitní konverzi timestamp
parametry na varchar2
, opět pomocí relace NLS_TIMESTAMP_FORMAT
. Pokud je relace NLS_TIMESTAMP_FORMAT
neodpovídá explicitní masce formátu ve vašem to_date
zavoláte, dostanete chybu nebo konverze vrátí výsledek, který neočekáváte.
Pokud je sloupec ve vaší tabulce ve skutečnosti typu date
, můžete přímo porovnat date
na timestamp
. Zdá se tedy, že není důvod volat to_date
tady. Na základě vašich ukázkových dat se však zdá, že sloupec ve vaší tabulce je ve skutečnosti typu timestamp
spíše než date
jak naznačuje váš kód, od date
nemá přesnost na zlomky sekund. Pokud je tomu tak, má ještě menší smysl volat to_date
ve vašem SELECT
protože vaše parametry jsou ve skutečnosti typu timestamp
a váš sloupec je typu timestamp
. Stačí porovnat timestamp
hodnoty.
Můj odhad proto je, že chcete něco jako
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;
a že chcete volat proceduru předáním skutečných časových razítek. Použití literálů časového razítka
Execute proc1(timestamp '2014-05-05 11:25:00', timestamp '2014-05-05 12:25:00' )
nebo explicitním voláním 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' ) );
To by se mělo zbavit všech implicitních typových konverzí, které aktuálně probíhají.