动态sql中时间处理

动态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>commit;

提交完成。

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;

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值