求救,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
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

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
关于你说的那里错了,在存储过程中没错,只是我刚才写的时候,少写了一对单引号;
再有慢了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
BenChiM888
关于你说的那里错了,在存储过程中没错,只是我刚才写的时候,少写了一对单引号;
再有慢了45秒,在此处无关紧要;
求救啊 !求救啊 !
作者: BenChiM888 发布时间: 2011-11-21
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28