文章目录
- 熟悉业务
- 模型设计
- 梳理映射关系
- 加工宽表
- 测试提交
FDM基础层:根据主题(需求),将源数据加工集成,形成业务明细表–宽表
熟悉业务
当我们的工作来到基础层,我们首先要做的是跟甲方沟通,要求甲方提供需求,同时我们应该熟悉数据字典,熟悉业务。
模型设计
模型设计(字段取数来源 字段加工规则 字段数据类型)
梳理映射关系
梳理映射关系:字段 源–目标的关系,字段的加工逻辑,表关联逻辑,过滤逻辑,伪代码。
我们做的项目是存款项目,需要梳理映射文档。以下是甲方提供的需求,我们需要从源数据中将对应的字段找出。
右边是甲方需要的字段,这些字段分布在两个表中,我们需要花时间找出他们来,最后找完的结果如下。
梳理完映射文档,我们需要建立明细表–宽表。
加工宽表
问甲方要建表语句
-- Create table
create table F_AGR_DEP_SAP_ACCT
(acct_no VARCHAR2(10),curr_cd VARCHAR2(20),curr_iden VARCHAR2(1),acct_typ VARCHAR2(30),pdp_cd VARCHAR2(20),dep_typ VARCHAR2(4),acct_char VARCHAR2(40),cust_no VARCHAR2(20),cust_name VARCHAR2(100),ibd_typ VARCHAR2(4),ibd_no VARCHAR2(20),card_no VARCHAR2(19),conntr_no VARCHAR2(20),org_no VARCHAR2(9),ases_org_no VARCHAR2(9),opac_org_no VARCHAR2(9),opac_amt NUMBER(20,2),opac_dt VARCHAR2(80),opac_perm_no VARCHAR2(15),opac_trl_no VARCHAR2(12),cacct_org_no VARCHAR2(9),cacct_dt VARCHAR2(80),cacct_trl_no VARCHAR2(12),intc_flg VARCHAR2(1),curr_char VARCHAR2(1),aval_dt VARCHAR2(80),cacl_dt VARCHAR2(80),fs_sts VARCHAR2(1),prds_instn_dpdw_flg VARCHAR2(1),drw_typ VARCHAR2(4),int_tax_flg VARCHAR2(1),acct_ctl_sts VARCHAR2(50),dpdw_rang VARCHAR2(1),com_od_flg VARCHAR2(1),od_int_days_n INTEGER,ddp_pdt NUMBER(20,2),ddp_acct_sts VARCHAR2(3),ddp_od_max NUMBER(20,2),od_int_amt NUMBER(20,2),frz_amt NUMBER(20,2),intc_amt NUMBER(20,2),avl_bal NUMBER(20,2),acct_bal NUMBER(20,2),int_bal NUMBER(20,2),int_acct_no VARCHAR2(32),ltm_pdtc_dt VARCHAR2(80),ltm_intc_dt VARCHAR2(80),ltm_tx_dt VARCHAR2(80),actu_pdt NUMBER(20,2),od_tm INTEGER,od_pdt NUMBER(20,2),od_amt NUMBER(20,2),od_days INTEGER,od_int NUMBER(20,2),ovdln_od_int NUMBER(20,2),od_lg_flg VARCHAR2(1),today_od_csh_amt NUMBER(20,2),ngo_dep_fl_totl INTEGER,ngo_int_acct_no VARCHAR2(32),ngo_aval_dt VARCHAR2(80),ngo_cncl_dt VARCHAR2(80),trt_val NUMBER(12,6),svc_bal NUMBER(20,2),od_csh_amt NUMBER(20,2),intr_cod VARCHAR2(2),intr NUMBER(12,6),fltr_fvr_sign VARCHAR2(1),fltr_fvr NUMBER(12,6),sleep_dt VARCHAR2(80),sleep_sts VARCHAR2(2),less_intr_flg VARCHAR2(1),mafe_flg VARCHAR2(1),mafe_owe_amt NUMBER(20,2),mafe_year VARCHAR2(2),sleep_flg VARCHAR2(1),insp_flg VARCHAR2(1),risk_lvl VARCHAR2(1),psbk_no INTEGER,psbk_prt_no VARCHAR2(13),etl_dt DATE
);
-- Add comments to the columns
comment on column F_AGR_DEP_SAP_ACCT.acct_nois '账号';
comment on column F_AGR_DEP_SAP_ACCT.curr_cdis '币种代码';
comment on column F_AGR_DEP_SAP_ACCT.curr_idenis '钞汇类别';
comment on column F_AGR_DEP_SAP_ACCT.acct_typis '账别';
comment on column F_AGR_DEP_SAP_ACCT.pdp_cdis '产品代码';
comment on column F_AGR_DEP_SAP_ACCT.dep_typis '存款种类';
comment on column F_AGR_DEP_SAP_ACCT.acct_charis '账号性质';
comment on column F_AGR_DEP_SAP_ACCT.cust_nois '客户编号';
comment on column F_AGR_DEP_SAP_ACCT.cust_nameis '客户姓名';
comment on column F_AGR_DEP_SAP_ACCT.ibd_typis '凭证种类';
comment on column F_AGR_DEP_SAP_ACCT.ibd_nois '凭证号码';
comment on column F_AGR_DEP_SAP_ACCT.card_nois '卡号';
comment on column F_AGR_DEP_SAP_ACCT.conntr_nois '联系人编号';
comment on column F_AGR_DEP_SAP_ACCT.org_nois '机构编号';
comment on column F_AGR_DEP_SAP_ACCT.ases_org_nois '考核机构';
comment on column F_AGR_DEP_SAP_ACCT.opac_org_nois '开户机构号';
comment on column F_AGR_DEP_SAP_ACCT.opac_amtis '开户金额';
comment on column F_AGR_DEP_SAP_ACCT.opac_dtis '开户日期';
comment on column F_AGR_DEP_SAP_ACCT.opac_perm_nois '开户许可证号';
comment on column F_AGR_DEP_SAP_ACCT.opac_trl_nois '开户柜员号';
comment on column F_AGR_DEP_SAP_ACCT.cacct_org_nois '销户机构号';
comment on column F_AGR_DEP_SAP_ACCT.cacct_dtis '销户日期';
comment on column F_AGR_DEP_SAP_ACCT.cacct_trl_nois '销户柜员号';
comment on column F_AGR_DEP_SAP_ACCT.intc_flgis '计息标志';
comment on column F_AGR_DEP_SAP_ACCT.curr_charis '钞汇属性';
comment on column F_AGR_DEP_SAP_ACCT.aval_dtis '起用日期';
comment on column F_AGR_DEP_SAP_ACCT.cacl_dtis '注销日期';
comment on column F_AGR_DEP_SAP_ACCT.fs_stsis '综合理财标志';
comment on column F_AGR_DEP_SAP_ACCT.prds_instn_dpdw_flgis '约定机构存取标志';
comment on column F_AGR_DEP_SAP_ACCT.drw_typis '支取方式';
comment on column F_AGR_DEP_SAP_ACCT.int_tax_flgis '利息税收税标志';
comment on column F_AGR_DEP_SAP_ACCT.acct_ctl_stsis '帐户控制状态';
comment on column F_AGR_DEP_SAP_ACCT.dpdw_rangis '通兑范围';
comment on column F_AGR_DEP_SAP_ACCT.com_od_flgis '法人账户透支标志';
comment on column F_AGR_DEP_SAP_ACCT.od_int_days_nis '应收透支息透支天数';
comment on column F_AGR_DEP_SAP_ACCT.ddp_pdtis '活存积数';
comment on column F_AGR_DEP_SAP_ACCT.ddp_acct_stsis '账户状态';
comment on column F_AGR_DEP_SAP_ACCT.ddp_od_maxis '账户最大透支额';
comment on column F_AGR_DEP_SAP_ACCT.od_int_amtis '计透支息金额';
comment on column F_AGR_DEP_SAP_ACCT.frz_amtis '冻结金额';
comment on column F_AGR_DEP_SAP_ACCT.intc_amtis '计息金额';
comment on column F_AGR_DEP_SAP_ACCT.avl_balis '可用金额';
comment on column F_AGR_DEP_SAP_ACCT.acct_balis '账户余额';
comment on column F_AGR_DEP_SAP_ACCT.int_balis '利息';
comment on column F_AGR_DEP_SAP_ACCT.int_acct_nois '收息账号';
comment on column F_AGR_DEP_SAP_ACCT.ltm_pdtc_dtis '上次计算积数日';
comment on column F_AGR_DEP_SAP_ACCT.ltm_intc_dtis '上次计息日';
comment on column F_AGR_DEP_SAP_ACCT.ltm_tx_dtis '上次交易日期';
comment on column F_AGR_DEP_SAP_ACCT.actu_pdtis '实积数';
comment on column F_AGR_DEP_SAP_ACCT.od_tmis '透支次数';
comment on column F_AGR_DEP_SAP_ACCT.od_pdtis '透支积数';
comment on column F_AGR_DEP_SAP_ACCT.od_amtis '透支金额';
comment on column F_AGR_DEP_SAP_ACCT.od_daysis '透支天数';
comment on column F_AGR_DEP_SAP_ACCT.od_intis '透支息';
comment on column F_AGR_DEP_SAP_ACCT.ovdln_od_intis '催收透支息';
comment on column F_AGR_DEP_SAP_ACCT.od_lg_flgis '透支科目标志';
comment on column F_AGR_DEP_SAP_ACCT.today_od_csh_amtis '当日累计透支取现金额';
comment on column F_AGR_DEP_SAP_ACCT.ngo_dep_fl_totlis '协议存款档数';
comment on column F_AGR_DEP_SAP_ACCT.ngo_int_acct_nois '协议收息账号';
comment on column F_AGR_DEP_SAP_ACCT.ngo_aval_dtis '协定存款设定日期';
comment on column F_AGR_DEP_SAP_ACCT.ngo_cncl_dtis '协定存款取消日期';
comment on column F_AGR_DEP_SAP_ACCT.trt_valis '税率';
comment on column F_AGR_DEP_SAP_ACCT.svc_balis '手续费';
comment on column F_AGR_DEP_SAP_ACCT.od_csh_amtis '累计透支取现金额';
comment on column F_AGR_DEP_SAP_ACCT.intr_codis '利率依据';
comment on column F_AGR_DEP_SAP_ACCT.intris '利率';
comment on column F_AGR_DEP_SAP_ACCT.fltr_fvr_signis '浮动利率加减码符号位';
comment on column F_AGR_DEP_SAP_ACCT.fltr_fvris '浮动利率加减码';
comment on column F_AGR_DEP_SAP_ACCT.sleep_dtis '睡眠设置日期';
comment on column F_AGR_DEP_SAP_ACCT.sleep_stsis '睡眠状态';
comment on column F_AGR_DEP_SAP_ACCT.less_intr_flgis '免执行小额利率标志';
comment on column F_AGR_DEP_SAP_ACCT.mafe_flgis '免收小额管理费标志';
comment on column F_AGR_DEP_SAP_ACCT.mafe_owe_amtis '小额管理费欠收金额';
comment on column F_AGR_DEP_SAP_ACCT.mafe_yearis '小额管理费扣收年份';
comment on column F_AGR_DEP_SAP_ACCT.sleep_flgis '不动户处理标志';
comment on column F_AGR_DEP_SAP_ACCT.insp_flgis '年检标志';
comment on column F_AGR_DEP_SAP_ACCT.risk_lvlis '风险等级';
comment on column F_AGR_DEP_SAP_ACCT.psbk_nois '册号';
comment on column F_AGR_DEP_SAP_ACCT.psbk_prt_nois '存单存折印刷号';
加工宽表 写存储过程,存储过程我们需要注意的是。
1.insert不能一条一条插入。需要使用select插入。插入的字段需要与刚刚建立的表字段相同顺序一致字段属性一致。
2.根据甲方提供的需求与项目主题,写出伪代码,
(SAACNAMT a left join SAACNACN b ona.FK_SAACN_KEY=b.SA_ACCT_NOwhere substr(a.SA_PDP_CODE,4,3)='SA1' and substr(b.SA_CUST_NO,1,1)='1')
UNION
(SAACNAMT a left join SAACNACN b ona.FK_SAACN_KEY=b.SA_ACCT_NOwhere substr(a.SA_PDP_CODE,4,3)='SA0')
根据伪代码写出存储过程,此处给出一个简略的存储过程
CREATE OR REPLACE PROCEDURE SP_F_AGR_DEP_SAP_ACCT IS/*****************************************************************************程序名称:SP_F_AGR_DEP_SAP_ACCT功能描述:个人活期账户信息宽表目 标 表:FDM.F_AGR_DEP_SAE_ACCT 活期企业存款账户信息源 表:SDM.SAACNAMT 活存资金档SDM.SAACNACN 活期存款主档创 建 人:孙云龙创建日期:20240620修改日期:修改人员:修改原因:******************************************************************************//*存储过程变量定义*/V_STARTTIME DATE; --开始时间V_ENDTTIME DATE; --结束时间V_ROWCOUNT INT; --记录数V_SQLCODE VARCHAR2(200);V_SQLERRM VARCHAR2(1000);V_SPNAME VARCHAR2(200);/* 程序开始执行*/
BEGIN/*变量赋值*/V_STARTTIME:=sysdate;V_SPNAME:='SP_F_AGR_DEP_SAP_ACCT';/*插入宽表数据*/INSERT INTO FDS.F_AGR_DEP_SAP_ACCTSELECT a.FK_SAACN_KEY ,-- a.SA_CURR_COD ,-- 币别a.SA_CURR_IDEN ,-- 钞汇鉴别b.SA_ACCT_TYP ,-- 帐别2a.SA_PDP_CODE ,-- 产品代码b.SA_DEP_TYP ,-- 存款种类b.SA_ACCT_CHAR ,-- 帐户性质b.SA_CUST_NO ,-- 客户编号b.SA_CUST_NAME ,-- 客户名称b.SA_DOC_TYP ,-- 凭证种类(DOC)b.SA_PSBK_PRT_NO1 ,-- 存折印刷号1b.SA_CARD_NO ,-- 卡号(CARD)b.SA_CONNTR_NO ,-- 联系人编号a.SA_BELONG_INSTN_COD ,-- 账户归属机构a.SA_ASES_INSTN_COD ,-- 考核机构b.SA_OPAC_INSTN_NO ,-- 开户机构号(OPAC)b.SA_OPAC_AMT ,-- 开户金额b.SA_OPAC_DT ,-- 开户日期-X8b.SA_OPAC_PERM_NO ,-- 开户许可证号b.SA_OPAC_TLR_NO ,-- 开户柜员号b.SA_CACCT_INSTN_NO ,-- 销户机构号b.SA_CACCT_DT ,-- 销户日期(CACCT)b.SA_CACCT_TLR_NO ,-- 销户柜员号b.SA_INTC_FLG ,-- 计息标志b.SA_CURR_TYP ,-- 钞汇属性b.SA_AVAL_DT ,-- 起用日期(AVAL)'18991231' ,-- b.SA_FS_STS ,-- 综合理财标志NULL ,-- b.SA_DRW_TYP ,-- 支取方式b.SA_INT_TAX_FLG ,-- 利息税计税标志b.SA_ACCT_CTL_STS ,-- 帐户控制状态b.SA_DW_RANG ,-- 通兑范围a.SA_COM_OD_FLG ,-- 法人帐户透支标志a.SA_OD_INT_DAYS_N ,-- 应收透支息透支天数a.SA_DDP_PDT ,-- 活存积数a.SA_DDP_ACCT_STS ,-- 活存帐户状态a.SA_DDP_OD_MAX ,-- 活存帐户最大透支额a.SA_OD_INT_AMT ,-- 计透支息金额a.SA_FRZ_AMT ,-- 法律冻结金额a.SA_INTC_AMT ,-- 贷方计息金额a.SA_AVL_BAL ,-- 可用余额(AVL)a.SA_ACCT_BAL ,-- 帐户余额a.SA_INT ,-- 利息(16位)a.SA_INT_ACCT_NO ,-- 利息帐号a.SA_LTM_PDTC_DT ,-- 上次计算积数日a.SA_LTM_INTC_DT ,-- 上次计息日a.SA_LTM_TX_DT ,-- 上次交易日期a.SA_ACTU_PDT ,-- 实积数a.SA_OD_TM ,-- 透支次数a.SA_OD_PDT ,-- 透支积数(OD)a.SA_OD_AMT ,-- 透支金额a.SA_OD_DAYS_N ,-- 透支天数a.SA_OD_INT ,-- 透支息(16位)a.SA_OVDLN_OD_INT ,-- 催收透支息(16位)a.SA_OD_LG_FLG ,-- 透支科目标志a.SA_TODAY_OD_CSH_AMT ,-- 当日累计透支取现金额a.SA_NGO_DEP_FL_TOTL ,-- 协议存款档数a.SA_NGO_INT_ACCT_NO ,-- 协议利息帐号a.SA_NGO_AVAL_DT ,-- 协定存款设定日期a.SA_NGO_CNCL_DT ,-- 协定存款取消日期a.SA_TRT_VAL ,-- 税率(VAL)a.SA_SVC ,-- 手续费a.SA_OD_CSH_AMT ,-- 累计透支取现金额(CSH)a.SA_INTR_COD ,-- 利率代码a.SA_INTR ,-- 利率a.SA_FLTR_FVR_SIGN ,-- 浮动利率加减码符号位a.SA_FLTR_FVR ,-- 浮动利率加减码(SC)a.SA_SLEEP_DATE ,-- 睡眠设置日期a.SA_SLEEP_STS ,-- 睡眠状态a.SA_LESS_INTR_FLG ,-- 免执行小额利率标志a.SA_MAFE_FLG ,-- 免收管理费标志a.SA_MAFE_OWE_AMT ,-- 管理费欠费金额a.SA_MAFE_YEAR ,-- 管理费扣收年份b.SA_SLEEP_PROC_FLG ,-- 不动户处理标志b.SA_INSP_FLG ,-- 年检标志b.SA_RISK_LVL ,-- 风险等级b.SA_PSBK_NO ,-- 存折册号b.SA_PSBK_PRT_NO , -- 存折印刷号a.etldtFROM SDS.SAACNAMT a left join SDS.SAACNACN b ona.FK_SAACN_KEY = b.SA_ACCT_NO --账号where substr(a.SA_PDP_CODE, 4, 3) = 'SA1' --产品编号 活期and substr(b.SA_CUST_NO, 1, 1) = '1' --1开头的客户编号 个人客户UNIONSELECT a.FK_SAACN_KEY ,-- a.SA_CURR_COD ,-- 币别a.SA_CURR_IDEN ,-- 钞汇鉴别b.SA_ACCT_TYP ,-- 帐别2a.SA_PDP_CODE ,-- 产品代码b.SA_DEP_TYP ,-- 存款种类b.SA_ACCT_CHAR ,-- 帐户性质b.SA_CUST_NO ,-- 客户编号b.SA_CUST_NAME ,-- 客户名称b.SA_DOC_TYP ,-- 凭证种类(DOC)b.SA_PSBK_PRT_NO1 ,-- 存折印刷号1b.SA_CARD_NO ,-- 卡号(CARD)b.SA_CONNTR_NO ,-- 联系人编号a.SA_BELONG_INSTN_COD ,-- 账户归属机构a.SA_ASES_INSTN_COD ,-- 考核机构b.SA_OPAC_INSTN_NO ,-- 开户机构号(OPAC)b.SA_OPAC_AMT ,-- 开户金额b.SA_OPAC_DT ,-- 开户日期-X8b.SA_OPAC_PERM_NO ,-- 开户许可证号b.SA_OPAC_TLR_NO ,-- 开户柜员号b.SA_CACCT_INSTN_NO ,-- 销户机构号b.SA_CACCT_DT ,-- 销户日期(CACCT)b.SA_CACCT_TLR_NO ,-- 销户柜员号b.SA_INTC_FLG ,-- 计息标志b.SA_CURR_TYP ,-- 钞汇属性b.SA_AVAL_DT ,-- 起用日期(AVAL)'18991231' ,-- b.SA_FS_STS ,-- 综合理财标志NULL ,-- b.SA_DRW_TYP ,-- 支取方式b.SA_INT_TAX_FLG ,-- 利息税计税标志b.SA_ACCT_CTL_STS ,-- 帐户控制状态b.SA_DW_RANG ,-- 通兑范围a.SA_COM_OD_FLG ,-- 法人帐户透支标志a.SA_OD_INT_DAYS_N ,-- 应收透支息透支天数a.SA_DDP_PDT ,-- 活存积数a.SA_DDP_ACCT_STS ,-- 活存帐户状态a.SA_DDP_OD_MAX ,-- 活存帐户最大透支额a.SA_OD_INT_AMT ,-- 计透支息金额a.SA_FRZ_AMT ,-- 法律冻结金额a.SA_INTC_AMT ,-- 贷方计息金额a.SA_AVL_BAL ,-- 可用余额(AVL)a.SA_ACCT_BAL ,-- 帐户余额a.SA_INT ,-- 利息(16位)a.SA_INT_ACCT_NO ,-- 利息帐号a.SA_LTM_PDTC_DT ,-- 上次计算积数日a.SA_LTM_INTC_DT ,-- 上次计息日a.SA_LTM_TX_DT ,-- 上次交易日期a.SA_ACTU_PDT ,-- 实积数a.SA_OD_TM ,-- 透支次数a.SA_OD_PDT ,-- 透支积数(OD)a.SA_OD_AMT ,-- 透支金额a.SA_OD_DAYS_N ,-- 透支天数a.SA_OD_INT ,-- 透支息(16位)a.SA_OVDLN_OD_INT ,-- 催收透支息(16位)a.SA_OD_LG_FLG ,-- 透支科目标志a.SA_TODAY_OD_CSH_AMT ,-- 当日累计透支取现金额a.SA_NGO_DEP_FL_TOTL ,-- 协议存款档数a.SA_NGO_INT_ACCT_NO ,-- 协议利息帐号a.SA_NGO_AVAL_DT ,-- 协定存款设定日期a.SA_NGO_CNCL_DT ,-- 协定存款取消日期a.SA_TRT_VAL ,-- 税率(VAL)a.SA_SVC ,-- 手续费a.SA_OD_CSH_AMT ,-- 累计透支取现金额(CSH)a.SA_INTR_COD ,-- 利率代码a.SA_INTR ,-- 利率a.SA_FLTR_FVR_SIGN ,-- 浮动利率加减码符号位a.SA_FLTR_FVR ,-- 浮动利率加减码(SC)a.SA_SLEEP_DATE ,-- 睡眠设置日期a.SA_SLEEP_STS ,-- 睡眠状态a.SA_LESS_INTR_FLG ,-- 免执行小额利率标志a.SA_MAFE_FLG ,-- 免收管理费标志a.SA_MAFE_OWE_AMT ,-- 管理费欠费金额a.SA_MAFE_YEAR ,-- 管理费扣收年份b.SA_SLEEP_PROC_FLG ,-- 不动户处理标志b.SA_INSP_FLG ,-- 年检标志b.SA_RISK_LVL ,-- 风险等级b.SA_PSBK_NO ,-- 存折册号b.SA_PSBK_PRT_NO, -- 存折印刷号a.etldtFROM SDS.SAACNAMT aleft join SDS.SAACNACN bon a.FK_SAACN_KEY = b.SA_ACCT_NOwhere substr(a.SA_PDP_CODE, 4, 3) = 'SA0'; --个人活期 2020年之前V_ROWCOUNT:=sql%rowcount; --获取上一条dml语句执行条数commit;V_ENDTTIME:=sysdate; --结束时间--游标 显式游标 定义 打开 遍历 关闭--隐式游标 dml语句--4个属性: found notfound isopen 游标名%rowcount/*插入正常日志*/insert into splogvalues (V_SPNAME,NULL,NULL,V_STARTTIME,V_ENDTTIME,V_ROWCOUNT,'正常' );commit; /* 异常处理 */
EXCEPTIONWHEN OTHERS THEN --捕获系统所有异常V_SQLCODE:=sqlcode;V_SQLERRM:=sqlerrm;/*插入异常日志*/insert into splogvalues (V_SPNAME,V_SQLCODE,V_SQLERRM,V_STARTTIME,V_ENDTTIME,0,'异常' );commit;
END;
在实际运行中,一般都是挂后台的,如果出错误我们没法看到实际的错误报告,因此我们需要将运行记录写进运行日志里,我们的运行日志需要获取以下信息,确保我们跑批结束后能及时发现并且定位错误信息。
存储过程名: V_SPNAME
错误代码: V_SQLCODE
错误信息: V_SQLERRM
存储过程开始时间: V_STARTTIME
存储过程结束时间: V_ENDTTIME
执行任务条数: V_ROWCOUNT
运行状态: ‘正常/异常’
测试提交
使用debug确定存储过程的每一步都没有出错即可