动态sql中,需要使用时间条件,是比较麻烦:
如果条件相对固定,用绑定变量,当然是最好的,特别是在oltp系统中,这种是最好的,推荐使用
如果条件很灵活(绑定变量的数量不好确定)或olap系统,用动态拼接就是不错的选择
USER1@TEST>create table t1(id number,tdate date);
表已创建。
USER1@TEST>
USER1@TEST>insert into t1 select level,
2 trunc(sysdate-level) from dual connect by level < 10;
已创建9行。
提交完成。
USER1@TEST>
USER1@TEST>select * from t1;
ID TDATE
---------- --------------
1 25-11月-13
2 24-11月-13
3 23-11月-13
4 22-11月-13
5 21-11月-13
6 20-11月-13
7 19-11月-13
8 18-11月-13
9 17-11月-13
已选择9行。
一:绑定变量
特点:简单,不容易出错,适合oltp系统,效率高
declare
type tab_t1 is table of t1%ROWTYPE index by binary_integer;
v_tab_t1 tab_t1;
v_begin_date date;
v_end_date date;
v_dyn_sql varchar2(2000);
begin
v_begin_date := to_date('2013-11-20','yyyy-MM-dd');
v_end_date := to_date('2013-11-23','yyyy-MM-dd');
v_dyn_sql := 'select * from t1 where tdate between :begin_date and :end_date';
execute immediate v_dyn_sql bulk collect into v_tab_t1 using v_begin_date,v_end_date;
for i in v_tab_t1.FIRST..v_tab_t1.LAST LOOP
DBMS_OUTPUT.PUT_LINE(v_tab_t1(i).id);
end loop;
end;
二:动态拼接
特点:灵活,使用较麻烦,容易出错,适合olap
declare
type tab_t1 is table of t1%ROWTYPE index by binary_integer;
v_tab_t1 tab_t1;
v_begin_date date;
v_end_date date;
v_dyn_sql varchar2(2000);
begin
v_begin_date := to_date('2013-11-20','yyyy-MM-dd');
v_end_date := to_date('2013-11-23','yyyy-MM-dd');
v_dyn_sql := 'select * from t1 where tdate between to_date('''||to_char(v_begin_date,'yyyy-MM-dd')||''',''yyyy-MM-dd'')'
||' and to_date('''||to_char(v_end_date,'yyyy-MM-dd')||''',''yyyy-MM-dd'')';
dbms_output.put_line(v_dyn_sql);
execute immediate v_dyn_sql bulk collect into v_tab_t1;
for i in v_tab_t1.FIRST..v_tab_t1.LAST LOOP
DBMS_OUTPUT.PUT_LINE(v_tab_t1(i).id);
end loop;
end;