这是存储过程中的一段执行插入代码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点 那种方式,也就是 直接按上面代码方式,不能插入数据呢? 而且这也是导致我非常郁闷的原因所在;求高人解救啊

解决方案 »

  1.   

    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;
      

  2.   

    这句话错了,
    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'') ';
      

  3.   

    BenChiM888
      关于你说的那里错了,在存储过程中没错,只是我刚才写的时候,少写了一对单引号;
    再有慢了45秒,在此处无关紧要;求救啊 !求救啊 !
      

  4.   

    根据你的逻辑改写了一下,试试这样行不
    /* 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;
      

  5.   

    你说的没有记录插入的时候,日志表中记录的sql拿出来看看。看单独运行能有记录插入么。
      

  6.   

    enChiM888,问题的正文中提到了,拿当时插入日志中的那条sqL,是可以插入数据的;to 5 楼,你这种的方式,我有想过,感觉应该是差不多,只是没测试,待会测试看下,希望能得到改观;
      

  7.   

    那你怎么确定直接执行的话,没有数据,并且确定你查询到日志中得sql就是你自动执行时候的sql呢,
    这些如果你100%确认,那就是见鬼了。
      

  8.   

    按benchi在8楼的回复,tmp_sql :=' insert into tb_a select * from tb_b b'||condi_time;
    write_log_me(tmp_sql);-- 将上面sql 插入到日志表中记录
    execute immediate(tmp_sql);那我的存储过程在一次的执行过程中,write_log_me(tmp_sql)中的tmp_sql 与 execute immediate(tmp_sql)中的 tmp_sql 可能不相同,是吗?
      

  9.   


    --你先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;
      

  10.   

    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;你这么拼接会导致没有空格,你先确定你是不是这么写的。
      

  11.   

    关于空格,不好意思,由于在这里发帖的时候,没怎么注意,写完就发出来了。
    但是,我保证,我的存储过程中的都是经过了认真检查的。而且,拼接SQL的各个小段,都是空格开头,空格结尾;
      

  12.   

    按照我10楼的方法做一下,看看最后执行的sql是什么样的,粘出来看看。
      

  13.   

    你确定一开始动态语句执行没插进的时候,那条select 语句有结果?你现在再试试没有插进去时的过程,再执行看能不能插