Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2545688
  • 博文数量: 308
  • 博客积分: 5547
  • 博客等级: 大校
  • 技术积分: 3782
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-24 09:47
个人简介

hello world.

文章分类

全部博文(308)

分类: Oracle

2013-11-20 11:14:24

    因工作需要,需要提取指定时间段的数据。这里大家肯定都会想到,使用SQL语句在WHERE语句中,对时间进行一下限制判断就好了,我开始也是这么去想的,可执行出乎意料的慢。原因很简单,表里的数据太多了。组长说,你一次查一天的数据。就会快很多。确实,大数据量就要有大数据量的处理方式,一个表几千万的数据,和一个表几百条数据的处理方式肯定不一样。即使表创建了索引,也不会像你想象的那么快。
    因此,我很快就想到了,编写一个存储过程,通过循环,一次查询一天的数据,插入到临时结果表。其中,主要涉及到一个SQL语句的拼接,经过测试,终于写好了,其实也都是雕虫小技。大家都会弄,下面就是我存储过程的代码了。

点击(此处)折叠或打开

  1. create or replace procedure P_112_TRADE7230(user_name varchar2)
  2. is
  3.    v_var_begindate varchar2(20);
  4.    v_var_enddate varchar2(20);
  5.    v_var_tempdate varchar2(20);
  6.    v_dblink varchar2(30);
  7.    v_begindate date;
  8.    v_enddate date;
  9.    v_sql varchar2(6000);
  10. begin
  11.    --获取指定时间段的欠费销号信息,提供给对端系统使用
  12.    --purpose:因工单数据比较多,因此只能使用循环,每次扫描一天的数据,最终完成
  13.    -- 指定时间段的欠费销号信息。
  14.    --author:程晓鹏
  15.    --date:2013.11.19
  16. /* v_var_begindate :='2013-04-01';
  17.   v_var_enddate := '2013-04-03';*/
  18.   v_var_begindate :='2013-04-01'; --开始时间
  19.   v_var_enddate := '2013-11-15'; --结束时间
  20.   v_dblink := F_GET_DBLINK_DSG(user_name); --DSG的dblink
  21.   v_begindate := to_date(v_var_begindate, 'yyyy-MM-dd'); --将开始时间字符串转化为日期类型
  22.   v_enddate := to_date(v_var_enddate, 'yyyy-MM-dd'); --将结束日期字符串转化为日期类型
  23.   while v_begindate <= v_enddate loop
  24.     v_var_tempdate := to_char(v_begindate, 'yyyy-MM-dd'); --当前临时日期字符串
  25.     --拼凑插入的sql语句
  26.     /*v_sql := 'insert into \*+append*\ ti_112_trade7230 nologging
  27.       select tb1.user_id, tb1.serial_number, tb1.eparchy_code,
  28.         decode(tb1.net_type_code, '''||'40'||''', '''||'1'||''', '''||'0'||''') product_class,
  29.         tb1.cust_id, tb1.cust_name, tb1.finish_date destory_time, sysdate in_time
  30.       from '|| user_name ||'.tf_bh_trade'|| v_dblink ||' tb1
  31.       where tb1.trade_type_code = '''||'7230'||'''
  32.       and tb1.cancel_tag = '''||'0'||'''
  33.       and tb1.net_type_code in ('''||'30'||''', '''||'34'||''', '''||'38'||''', '''||'39'||''', '''||'40'||''')
  34.       and tb1.finish_date >= to_date('''||v_var_tempdate||' 00:00:00' ||''','''||'yyyy-MM-dd hh24:mi:ss'||''')
  35.       and tb1.finish_date < to_date('''||v_var_tempdate||' 23:59:59' ||''','''||'yyyy-MM-dd hh24:mi:ss'||''')';*/
  36.       
  37.       --拼凑光纤45的数据SQL 程晓鹏 2013.11.20 update
  38.       v_sql := 'insert into /*+append*/ ti_112_trade7230 nologging
  39.       select tb1.user_id, tb1.serial_number, tb1.eparchy_code,
  40.          '''||'1'||''' product_class,
  41.         tb1.cust_id, tb1.cust_name, tb1.finish_date destory_time, sysdate in_time
  42.       from '|| user_name ||'.tf_bh_trade'|| v_dblink ||' tb1
  43.       where tb1.trade_type_code = '''||'7230'||'''
  44.       and tb1.cancel_tag = '''||'0'||'''
  45.       and tb1.brand_code = '''||'YTZX'||'''
  46.       and tb1.net_type_code = '''||'45'||'''
  47.       and tb1.finish_date >= to_date('''||v_var_tempdate||' 00:00:00' ||''','''||'yyyy-MM-dd hh24:mi:ss'||''')
  48.       and tb1.finish_date < to_date('''||v_var_tempdate||' 23:59:59' ||''','''||'yyyy-MM-dd hh24:mi:ss'||''')';
  49.   execute immediate v_sql;
  50.   commit;
  51.     --dbms_output.put_line(v_sql);
  52.     v_begindate := v_begindate + 1; --时间增加一天,进行第二天数据的扫描
  53.   end loop;
  54. end P_112_TRADE7230;


阅读(6971) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~