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
打印输入日期,但日期没有返回。
答案 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_starttime
和v_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}}将解决问题。