Din procedure tager parametre af typen timestamp
. Du sender faktisk parametre af typen varchar2
i dit opkald. Det tvinger Oracle til at udføre implicit konvertering af varchar2
parametre til timestamp
ved hjælp af din sessions NLS_TIMESTAMP_FORMAT
. Det vil sandsynligvis være forskelligt for forskellige sessioner, så det er sandsynligt, at i det mindste nogle sessioner vil få en fejl, fordi strengen ikke matcher formatet for den sessions NLS_TIMESTAMP_FORMAT
. Du ville være meget bedre tjent med at bestå et faktisk tidsstempel, enten ved eksplicit at kalde to_timestamp
eller ved at sende et tidsstempel bogstaveligt.
Din procedure tager derefter timestamp
parametre og videregive dem til to_date
fungere. to_date
funktion tager ikke parametre af typen timestamp
, det tager kun parametre af typen varchar2
. Det tvinger Oracle til at foretage endnu en implicit konvertering af timestamp
parametre til varchar2
, igen ved at bruge sessionens NLS_TIMESTAMP_FORMAT
. Hvis sessionens NLS_TIMESTAMP_FORMAT
matcher ikke den eksplicitte formatmaske i din to_date
ring, får du en fejl, eller konverteringen vil returnere et resultat, som du ikke forventer.
Hvis kolonnen i din tabel faktisk er af typen date
, kan du direkte sammenligne en date
til et timestamp
. Så der ser ikke ud til at være nogen grund til at kalde to_date
her. Baseret på dine eksempeldata ser det dog ud til, at kolonnen i din tabel faktisk er af typen timestamp
i stedet for date
som din kode antyder, da en date
har ikke brøkdele af sekunders præcision. Hvis det er tilfældet, giver det endnu mindre mening at kalde to_date
i din SELECT
sætning, da dine parametre faktisk er af typen timestamp
og din kolonne er af typen timestamp
. Bare sammenlign timestamp
værdier.
Mit gæt er derfor, at du vil have noget lignende
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;
og at du vil kalde proceduren ved at sende faktiske tidsstempler. Brug af tidsstempel bogstaver
Execute proc1(timestamp '2014-05-05 11:25:00', timestamp '2014-05-05 12:25:00' )
eller ved eksplicit at kalde 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' ) );
Det burde slippe af med alle de implicitte typekonverteringer, der i øjeblikket finder sted.