因工作需要,需要提取指定时间段的数据。这里大家肯定都会想到,使用SQL语句在WHERE语句中,对时间进行一下限制判断就好了,我开始也是这么去想的,可执行出乎意料的慢。原因很简单,表里的数据太多了。组长说,你一次查一天的数据。就会快很多。确实,大数据量就要有大数据量的处理方式,一个表几千万的数据,和一个表几百条数据的处理方式肯定不一样。即使表创建了索引,也不会像你想象的那么快。
因此,我很快就想到了,编写一个存储过程,通过循环,一次查询一天的数据,插入到临时结果表。其中,主要涉及到一个SQL语句的拼接,经过测试,终于写好了,其实也都是雕虫小技。大家都会弄,下面就是我存储过程的代码了。
-
create or replace procedure P_112_TRADE7230(user_name varchar2)
-
is
-
v_var_begindate varchar2(20);
-
v_var_enddate varchar2(20);
-
v_var_tempdate varchar2(20);
-
v_dblink varchar2(30);
-
v_begindate date;
-
v_enddate date;
-
v_sql varchar2(6000);
-
begin
-
--获取指定时间段的欠费销号信息,提供给对端系统使用
-
--purpose:因工单数据比较多,因此只能使用循环,每次扫描一天的数据,最终完成
-
-- 指定时间段的欠费销号信息。
-
--author:程晓鹏
-
--date:2013.11.19
-
/* v_var_begindate :='2013-04-01';
-
v_var_enddate := '2013-04-03';*/
-
v_var_begindate :='2013-04-01'; --开始时间
-
v_var_enddate := '2013-11-15'; --结束时间
-
v_dblink := F_GET_DBLINK_DSG(user_name); --DSG的dblink
-
v_begindate := to_date(v_var_begindate, 'yyyy-MM-dd'); --将开始时间字符串转化为日期类型
-
v_enddate := to_date(v_var_enddate, 'yyyy-MM-dd'); --将结束日期字符串转化为日期类型
-
while v_begindate <= v_enddate loop
-
v_var_tempdate := to_char(v_begindate, 'yyyy-MM-dd'); --当前临时日期字符串
-
--拼凑插入的sql语句
-
/*v_sql := 'insert into \*+append*\ ti_112_trade7230 nologging
-
select tb1.user_id, tb1.serial_number, tb1.eparchy_code,
-
decode(tb1.net_type_code, '''||'40'||''', '''||'1'||''', '''||'0'||''') product_class,
-
tb1.cust_id, tb1.cust_name, tb1.finish_date destory_time, sysdate in_time
-
from '|| user_name ||'.tf_bh_trade'|| v_dblink ||' tb1
-
where tb1.trade_type_code = '''||'7230'||'''
-
and tb1.cancel_tag = '''||'0'||'''
-
and tb1.net_type_code in ('''||'30'||''', '''||'34'||''', '''||'38'||''', '''||'39'||''', '''||'40'||''')
-
and tb1.finish_date >= to_date('''||v_var_tempdate||' 00:00:00' ||''','''||'yyyy-MM-dd hh24:mi:ss'||''')
-
and tb1.finish_date < to_date('''||v_var_tempdate||' 23:59:59' ||''','''||'yyyy-MM-dd hh24:mi:ss'||''')';*/
-
-
--拼凑光纤45的数据SQL 程晓鹏 2013.11.20 update
-
v_sql := 'insert into /*+append*/ ti_112_trade7230 nologging
-
select tb1.user_id, tb1.serial_number, tb1.eparchy_code,
-
'''||'1'||''' product_class,
-
tb1.cust_id, tb1.cust_name, tb1.finish_date destory_time, sysdate in_time
-
from '|| user_name ||'.tf_bh_trade'|| v_dblink ||' tb1
-
where tb1.trade_type_code = '''||'7230'||'''
-
and tb1.cancel_tag = '''||'0'||'''
-
and tb1.brand_code = '''||'YTZX'||'''
-
and tb1.net_type_code = '''||'45'||'''
-
and tb1.finish_date >= to_date('''||v_var_tempdate||' 00:00:00' ||''','''||'yyyy-MM-dd hh24:mi:ss'||''')
-
and tb1.finish_date < to_date('''||v_var_tempdate||' 23:59:59' ||''','''||'yyyy-MM-dd hh24:mi:ss'||''')';
-
execute immediate v_sql;
-
commit;
-
--dbms_output.put_line(v_sql);
-
v_begindate := v_begindate + 1; --时间增加一天,进行第二天数据的扫描
-
end loop;
-
end P_112_TRADE7230;
阅读(6971) | 评论(0) | 转发(0) |