这是存储过程中的一段执行插入代码SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') INTO current_date FROM DUAL; --取系统当前时间start_time := to_char(to_date(current_date, 'yyyy-mm-dd hh24:mi:ss') - 10 / (24 * 60),'yyyy-mm-dd hh24:mi:ss');
end_time: = current_date;condi_time := 'where b.stime> to_date(''||start_time||'',''yyyy-mm-dd hh24:mi:ss'') and b.stime < to_date(''||end_time||'',''yyyy-mm-dd hh24:mi:ss'') ';tmp_sql :=' insert into tb_a select * from tb_b b'||condi_time;write_log_me(tmp_sql);-- 将上面sql 插入到日志表中记录execute immediate(tmp_sql);
commit;
由于自己对数据库不怎么了解,导致最近很是郁闷,出现的这些莫名奇妙的问题。1.动态sql如上,但是通过动态获取时间条件的方式来插入数据,tb_a 却没有数据,但是我从日志表中拿出当时执行的那句sql出来,却又能插入数据;2.如果我将 condi_time 这个条件中的时间,直接写死,跟动态获取来的时间为同一时间,如
condi_time :='b.stime> to_date(''2011-11-21 00:00:00'',''yyyy-mm-dd hh24:mi:ss'')
and b.stime < to_date(''2011-11-21 10:00:00'',''yyyy-mm-dd hh24:mi:ss'') ';
却又能将数据插入到 tb_a 表中;
而且,当我 在这里的时候写死时间,也是能插入数据大
start_time := '2011-11-21 00:00:00';
end_time :='2011-11-21 10:00:00';
3.非但如此,当我在PL/SQL中调试该存储过程的时候,时间条件不是写死,而是通过动态获取来,一步一步的调试,却又能将数据插入到 tb_a 表。所以,我想知道,为什么第1点 那种方式,也就是 直接按上面代码方式,不能插入数据呢? 而且这也是导致我非常郁闷的原因所在;求高人解救啊
end_time: = current_date;condi_time := 'where b.stime> to_date(''||start_time||'',''yyyy-mm-dd hh24:mi:ss'') and b.stime < to_date(''||end_time||'',''yyyy-mm-dd hh24:mi:ss'') ';tmp_sql :=' insert into tb_a select * from tb_b b'||condi_time;write_log_me(tmp_sql);-- 将上面sql 插入到日志表中记录execute immediate(tmp_sql);
commit;
由于自己对数据库不怎么了解,导致最近很是郁闷,出现的这些莫名奇妙的问题。1.动态sql如上,但是通过动态获取时间条件的方式来插入数据,tb_a 却没有数据,但是我从日志表中拿出当时执行的那句sql出来,却又能插入数据;2.如果我将 condi_time 这个条件中的时间,直接写死,跟动态获取来的时间为同一时间,如
condi_time :='b.stime> to_date(''2011-11-21 00:00:00'',''yyyy-mm-dd hh24:mi:ss'')
and b.stime < to_date(''2011-11-21 10:00:00'',''yyyy-mm-dd hh24:mi:ss'') ';
却又能将数据插入到 tb_a 表中;
而且,当我 在这里的时候写死时间,也是能插入数据大
start_time := '2011-11-21 00:00:00';
end_time :='2011-11-21 10:00:00';
3.非但如此,当我在PL/SQL中调试该存储过程的时候,时间条件不是写死,而是通过动态获取来,一步一步的调试,却又能将数据插入到 tb_a 表。所以,我想知道,为什么第1点 那种方式,也就是 直接按上面代码方式,不能插入数据呢? 而且这也是导致我非常郁闷的原因所在;求高人解救啊
end_time: = current_date;condi_time := 'where b.stime> to_date('''||start_time||''',''yyyy-mm-dd hh24:mi:ss'') and b.stime < to_date('''||end_time||''',''yyyy-mm-dd hh24:mi:ss'') ';tmp_sql :=' insert into tb_a select * from tb_b b '||condi_time;write_log_me(tmp_sql);-- 将上面sql 插入到日志表中记录execute immediate(tmp_sql);
commit;
CONDI_TIME := 'where b.stime> to_date('''||start_time||''',''yyyy-mm-dd hh24:mi:ss'') and b.stime < to_date('''||end_time||''',''yyyy-mm-dd hh24:mi:ss'') ';
关于你说的那里错了,在存储过程中没错,只是我刚才写的时候,少写了一对单引号;
再有慢了45秒,在此处无关紧要;求救啊 !求救啊 !
/* Formatted on 2011/11/21 12:01 (Formatter Plus v4.8.8) */
DECLARE
start_time DATE;
end_time DATE;
condi_time VARCHAR2 (200);
tmp_sql VARCHAR2 (2000);
BEGIN
start_time := SYSDATE - 10 / (24 * 60);
end_time := SYSDATE;
condi_time := 'where b.stime>:1 and b.stime <:2'; --使用绑定变量
tmp_sql := ' insert into tb_a select * from tb_b b ' || condi_time;
write_log_me (tmp_sql); -- 将上面sql 插入到日志表中记录
EXECUTE IMMEDIATE tmp_sql
USING start_time, end_time; --给绑定变量赋值 COMMIT;
END;
这些如果你100%确认,那就是见鬼了。
write_log_me(tmp_sql);-- 将上面sql 插入到日志表中记录
execute immediate(tmp_sql);那我的存储过程在一次的执行过程中,write_log_me(tmp_sql)中的tmp_sql 与 execute immediate(tmp_sql)中的 tmp_sql 可能不相同,是吗?
--你先truncate 你的日志表,然后做如下改动,然后再自动执行一遍,然后粘贴出你的sql。
--一次执行中你说的两个sql当然是一致的。SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') INTO current_date FROM DUAL; --取系统当前时间start_time := to_char(to_date(current_date, 'yyyy-mm-dd hh24:mi:ss') - 10 / (24 * 60),'yyyy-mm-dd hh24:mi:ss');
end_time: = current_date;condi_time := 'where b.stime> to_date(''||start_time||'',''yyyy-mm-dd hh24:mi:ss'') and b.stime < to_date(''||end_time||'',''yyyy-mm-dd hh24:mi:ss'') ';tmp_sql :=' insert into tb_a select * from tb_b b'||condi_time;write_log_me(tmp_sql);-- 将上面sql 插入到日志表中记录execute immediate(tmp_sql);
commit;
exception
when others then
write_log_me(tmp_sql);
commit;
但是,我保证,我的存储过程中的都是经过了认真检查的。而且,拼接SQL的各个小段,都是空格开头,空格结尾;