输入参数的日期格式错误?

时间:2014-05-08 13:26:20

标签: sql oracle plsql

CREATE OR REPLACE PROCEDURE PROC1(
   V_STARTTIME    IN DATE,
   V_ENDTIME      IN DATE)
BEGIN
INSERT INTO TAB1
SELECT COINS FROM TAB2
WHERE DATE BETWEEN TO_DATE(V_STARTTIME,'MM/DD/YYYY') AND TO_DATE(V_ENDTIME,'MM/DD/YYYY');
COMMIT;
END;

SAMPLE DATE in Tab2 IS TIMESTAMP DATATYPE 5/5/2014 9:46:38.000000 AM

当我尝试执行

Execute PROC1(TO_DATE('5/5/2014','MM/DD/YYYY'),TO_DATE('5/6/2014','MM/DD/YYYY'));

程序已成功完成,但我的Insert into被忽略。

我尝试通过dbms_output.put_line打印输入日期,但日期没有返回。

2 个答案:

答案 0 :(得分:1)

函数TO_DATE需要string作为第一个参数。

CREATE OR REPLACE PROCEDURE PROC1(
   V_STARTTIME    IN DATE,
   V_ENDTIME      IN DATE)
BEGIN
 INSERT INTO TAB1
   SELECT COINS FROM TAB2 WHERE DATE BETWEEN V_STARTTIME AND V_ENDTIME;
 COMMIT; --You should not use commit in procedure.
END;

答案 1 :(得分:1)

这与question you asked yesterday非常相似。

如果v_starttimev_endtime的类型为date,则在to_date上调用to_date是没有意义的。 date不会使用varchar2类型的参数。它采用date类型的参数。如果您尝试将to_date传递给date,则Oracle必须使用会话varchar2隐式地将NLS_DATE_FORMAT投射到to_date。如果这与您传递给date的格式掩码不匹配,则可能会收到错误消息,或者您可能会收到错误的结果。与昨天的问题一样,您希望避免隐式转换。

Oracle中的to_date包含日期和时间组件(到第二个)。如果您正在执行trunc以确保时间组件是午夜,请改用INSERT INTO TAB1( column_name ) SELECT COINS FROM TAB2 WHERE <<timestamp column>> BETWEEN trunc( v_starttime ) AND trunc( v_endtime ); 函数。

SELECT

你说你的&#34;插入被忽略&#34;。这似乎不太可能。您的INSERT语句更有可能返回0行,因此SQL%ROWCOUNT插入了0行。那不是错误。如果您想将其视为错误,则需要在INSERT之后检查INSERT,如果SELECT语句插入0行,则抛出错误。

如果to_date由于隐式转换错误而没有选择任何行,那么摆脱trunc并可能添加{{1}}将解决问题。