oracle游标

create table tb_lzw_zj201103160003_ser
(
seq_code number(5) ,
servnumber varchar2(20) ,
pd_type varchar2(64) ,
card_type varchar2(64)
)
;

/*
select count(servnumber) , count(distinct servnumber) from tb_lzw_zj201103160003_ser ;
6236362362


select servnumber
from tb_lzw_zj201103160003_ser
group by servnumber
having count(servnumber) >= 2
;

13590099966

select * from tb_lzw_zj201103160003_ser where servnumber = '13590099966';
;

5969613590099966普通老客户银卡
6231413590099966特殊评定银卡


----需求人确定保留"特殊评定"的记录

delete from tb_lzw_zj201103160003_ser
where seq_code = 59696 ;
commit ;


select
a.pd_type , count(a.servnumber)
from tb_lzw_zj201103160003_ser a
group by a.pd_type
order by a.pd_type
;

积分评定6965
积分评定(优质客户)4107
老客户升级878
老客户升级(优质客户)444
内部测试客户24
普通老客户48751
套餐评定29
特殊评定1118
特殊评定(优质客户)46


select card_type , count(servnumber) cnt
from tb_lzw_zj201103160003_ser
group by card_type
order by card_type
;

金卡3135
银卡59040
钻石卡187
*/

/*

卡号码组成为:19 YY PP F X1 X2 X3 X4 X5 X6 X7 X8 X9 共计16位
 
号码的格式定义如下: 
19广东省代码
YY编制为VIP卡生产年号(今年11)
PPVIP卡生产批次标志(按照厂家接到生产数据的月份定,统一填写为01)
F1代表钻卡,2代表金卡,3代表银卡
X1 X2各市区域代码
X3为客户类型代码,1为积分客户,2为重要客户,3为集团客户,4为内部测试客户,5、优质客户 6为套餐办理客户,7尊享老客户(即十年老客户升级VIP资格的),9其他。
X4 X5 X6 X7 X8 X9客户编号:6位号码按顺序产生


191101F12XYYYYYY


为客户类型代码,
1为积分客户,2为重要客户,3为集团客户,4为内部测试客户,5、优质客户
6为套餐办理客户,7尊享老客户(即十年老客户升级VIP资格的),9其他。

1积分评定6965
5积分评定(优质客户)4107
7老客户升级878
5老客户升级(优质客户)444
4内部测试客户24
7普通老客户48751
6套餐评定29
2特殊评定1118
5特殊评定(优质客户)46
*/


create table tb_lzw_zj201103160003_ser2 nologging as
select a.seq_code , --序号
a.servnumber , --号码
a.pd_type , --评定类型(ITC)
a.card_type , --2011卡类
a.style||a.style2 code , --卡号前10位
row_number () over (partition by a.style||a.style2 order by a.servnumber) code1 --序列号
from (select
x.seq_code ,
x.servnumber ,
x.pd_type ,
x.card_type ,
case when x.card_type = '钻石卡' then 191101112
when x.card_type = '金卡' then 191101212
when x.card_type = '银卡' then 191101312 end style ,
case when x.pd_type = '积分评定' then 1
when x.pd_type = '特殊评定' then 2
when x.pd_type = '内部测试客户' then 4
when x.pd_type like '%(优质客户)' then 5
when x.pd_type = '套餐评定' then 6
when x.pd_type = '普通老客户' then 7
when x.pd_type = '老客户升级' then 7 end style2
from tb_lzw_zj201103160003_ser x
) a
;


----中间汇总数据
create table tb_lzw_zj201103160003_ser3
(
seq_code number(5) , --序号
servnumber varchar2(20) , --号码
pd_type varchar2(64) , --评定类型(ITC)
card_type varchar2(64) , --2011卡类
code number(10) , --卡号前10位
code2 number(5) --客户编号序列号
)
;


----银卡号码处理(2、银卡的X9(最后一位)避免用4、7)

declare

v_seq_code number(5) ;
v_servnumber varchar2(20) ;
v_pd_type varchar2(64) ;
v_card_type varchar2(64) ;
v_code varchar2(20) ;
v_code1 number(5) ;
v_code2 number(5):=0 ;

cursor v_cursor is
select a.seq_code ,
a.servnumber ,
a.pd_type ,
a.card_type ,
a.code ,
a.code1
from tb_lzw_zj201103160003_ser2 a
where a.card_type = '银卡'
;

begin
open v_cursor;
loop
fetch v_cursor into v_seq_code,v_servnumber,v_pd_type,v_card_type,v_code,v_code1;
exit when v_cursor%notfound;

v_code2:=v_code2+1;

if v_code1=1 then
v_code2:=1;
elsif mod(v_code2,10)=4 or mod(v_code2,10)=7 then
v_code2:=v_code2+1;
end if;
insert into tb_lzw_zj201103160003_ser3 values
(v_seq_code,v_servnumber,v_pd_type,v_card_type,v_code,v_code2);
commit ;

end loop ;
end
;

----钻石卡、金卡号码处理(1、全球通钻石卡、金卡的X9(最后一位) 要求为8)

insert into tb_lzw_zj201103160003_ser3 nologging
select
s.seq_code ,
s.servnumber ,
s.pd_type ,
s.card_type ,
s.code ,
(s.code1-1)*10+8
from tb_lzw_zj201103160003_ser2 s
where s.card_type in ('钻石卡','金卡')
;
commit ;


/*
select distinct
card_type ,
mod(code2,10)
from tb_lzw_zj201103160003_ser3
order by card_type , mod(code2,10)
;

金卡8
银卡0
银卡1
银卡2
银卡3
银卡5
银卡6
银卡8
银卡9
钻石卡8

select
count(code||code2) ,
count(distinct code||code2)
from tb_lzw_zj201103160003_ser3
;

6236262362
*/

----导出数据

select
a.seq_code ,
a.servnumber ,
a.pd_type ,
a.card_type ,
case when length(a.code2) = 1 then a.code||'00000'||a.code2
when length(a.code2) = 2 then a.code||'0000'||a.code2
when length(a.code2) = 3 then a.code||'000'||a.code2
when length(a.code2) = 4 then a.code||'00'||a.code2
when length(a.code2) = 5 then a.code||'0'||a.code2
when length(a.code2) = 6 then a.code||a.code2 end
from tb_lzw_zj201103160003_ser3 a
order by a.seq_code
;


drop table tb_lzw_zj201103160003_ser purge ;
drop table tb_lzw_zj201103160003_ser2 purge ;
drop table tb_lzw_zj201103160003_ser3 purge ;

你可能感兴趣的:(oracle)