+ -
当前位置:首页 → 问答吧 → 求救,execute immediate执行动态sql,快崩溃了

求救,execute immediate执行动态sql,快崩溃了

时间:2011-11-21

来源:互联网

这是存储过程中的一段执行插入代码
SQL code

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

作者: yimail   发布时间: 2011-11-21

SQL code
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;

作者: tx2730   发布时间: 2011-11-21

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

作者: BenChiM888   发布时间: 2011-11-21

慢了45秒。。。

引用 1 楼 tx2730 的回复:
SQL code
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-……

作者: BenChiM888   发布时间: 2011-11-21

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

求救啊 !求救啊 !

作者: yimail   发布时间: 2011-11-21

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

作者: tx2730   发布时间: 2011-11-21

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

引用 4 楼 yimail 的回复:
BenChiM888
关于你说的那里错了,在存储过程中没错,只是我刚才写的时候,少写了一对单引号;
再有慢了45秒,在此处无关紧要;

求救啊 !求救啊 !

作者: BenChiM888   发布时间: 2011-11-21

热门下载

更多