在数据迁移期间oracle学习笔记
0主键(自增) 1用户代码 2区域代码 3承保公司代码 4理赔编码 5投保确认码 6案件状态 7案件进展 8重开案件进展 9转换后案件状态
需求分析:
1、根据上述要求创建需要的表
2、将几个表中的相应数据对应插入到新创建的表中
3、因为claim_id是固定的,可以根据claim_id进行循环插入几个表中的数据
4、在7、8项中涉及到案件状态的去重和拼接
5、案件状态的转换
--创建表T_CLAIM_NEW
create table T_CLAIM_NEW(
ID NUMBER, --主键ID
ClaimId number(10),
UserCode varchar2(30), --用户名称
AreaCode varchar2(10), --地区代码
CompanyCode varchar2(8), --公司代码
ClaimQueryNo varchar2(50), --理赔编码
PolicyConfirmNo varchar2(50), --投保确认码
CLAIM_STATUS varchar2(2), --案件状态
G_CLAIM_STATUS varchar2(30), --案件进展
REOPEN_CLAIM_STATUS varchar2(30), --重开后的案件进展
IA_CLAIM_STATUS varchar2(30), --转换后的案件状态
CONSTRAINT PK_ID PRIMARY KEY (ID)
);
--自增序列
CREATE SEQUENCE T_CLAIM_NEW_ID1
INCREMENT BY 1 --每次+1
START WITH 1 --从1开始
NOMAXVALUE --不设置最大值
NOCYCLE
NOCACHE;
--创建触发器
CREATE OR REPLACE TRIGGER TRI_T_CLAIM_NEW_ID1
BEFORE INSERT
ON T_CLAIM_NEW
FOR EACH ROW
begin
select T_CLAIM_NEW_ID1.nextval INTO :NEW.ID from dual;
end;
/
************************************************************************************************************************************************
--去重:
--创建临时表
create table ma_20180709 as (select * from T_CLAIM_LIST_RECORD);
--删除重复数据并保留最大时间(因为最后一次更新时间也是id越大时间越大)
delete from ma_20180709 where RECORD_ID not in (select max(RECORD_ID) from ma_20180709 group by claim_id,claim_code);
************************************************************************************************************************************************
--查询表ma_20180709中相应数据并拼接claim_status字段
--insert into tablename
select listagg(claim_status,',') within group(order by CLAIM_STATUS) from ma_20180709 group by claim_id,claim_code;
************************************************************************************************************************************************
--对轨迹表进行去重等操作
--创建ma_01临时表
create table ma_01 as (select * from T_CLAIM_LIST_RECORD);
--去重
delete from ma_01 where RECORD_ID not in (select max(RECORD_ID) from ma_01 group by claim_id,claim_code);
--对重开轨迹表进行去重等操作
--创建ma_03临时表
create table ma_03 as (select * from T_CLAIM_LIST_RECORD_REOPEN);
--去重
delete from ma_03 where RECORD_ID not in (select max(RECORD_ID) from ma_03 group by claim_id,claim_code);
--创建主表T_CLAIM_LIST的临时表ma_02
create table ma_02 as (select * from T_CLAIM_LIST);
************************************************************************************************************************************************
--函数入口
declare
--声明投保确认码
CONFIRM_SEQUENCE varchar(50);
--声明案件状态
claim_status_bj varchar2(30);
--声明案件进展(拼接后案件状态)
claim_status_pj varchar2(30);
--声明重开后案件状态
claim_status_ck varchar2(30);
--声明游标
cursor TAGENTMENUd is select * from t_claim_list_record where 1=1;
begin
for claim in TAGENTMENUd LOOP
--查询出claim_id相等的案件状态并赋值给变量claim_status_bj
select CLAIM_STATUS into claim_status_bj from ma_01 where claim_id = claim.claim_id;
--查询出claim_id相等的案件状态并赋值给变量CONFIRM_SEQUENCE
select CONFIRM_SEQUENCE_NO into CONFIRM_SEQUENCE from ma_02 where claim_id=claim.claim_id;
--拼接去重后轨迹表ma_01中的案件状态并根据claim_id赋值给变量claim_status_pj
select listagg(claim_status,',') within group(order by CLAIM_STATUS) into claim_status_pj from ma_01 where claim_id=claim.claim_id;
--拼接去重后重开轨迹表ma_03中的案件状态,并根据claim_id赋值给变量claim_starus_ck
select listagg(claim_status,',') within group(order by CLAIM_STATUS) into claim_starus_ck from ma_03 where claim_id=claim.claim_id;
--将拼接后的案件状态进行对应转换
--插入操作
insert into T_CLAIM_NEW(ClaimId,AreaCode,ClaimQueryNo,POLICYCONFIRMNO,CLAIM_STATUS,G_CLAIM_STATUS,REOPEN_CLAIM_STATUS)
values(claim.claim_id,'110000',claim.claim_code,CONFIRM_SEQUENCE,claim_status_bj,claim_status_pj,claim_starus_ck);
END LOOP;
end;
/
************************************************************************************************************************************************
注意点:
1、在函数创建过程中遇到变量问题,想要给查询出来的东西赋值,赋值语法为:
'select 字段名(公式) into 变量名 from tablename where 条件语句'
2、函数中的循环 如上述所示
for '变量' in '范围/结果集' loop