一、生产上的一次需求
现有存量的一些数据需要刷数:根据客户表找到注销状态的客户号,循环这些客户号,将客户关联的账号表也一起注销掉、将客户关联的证件映射表也一起删除掉。账号表、和证件映射表都是分表的,从0~29,客户表也是分表一样。
写了个批量执行的脚本:
/**
找到客户表中状态为C的记录(游标1)
逐个遍历游标1
如果存在客户的账户表,根据客户号更新账号表,将acState更新为C
如果存在客户证件映射,根据客户号删除证件映射表记录
注意:执行前需要修改cur_mkt_cif中表后面的数字,从0开始持续到29。
*/
DECLARE
C_NUM NUMBER(2,0);
V_STATE_CANCEL CONSTANT VARCHAR := 'C';
CURSOR cur_mkt_cif IS SELECT CIF_NO from MKTPRD.MKT_CIF_0 WHERE CIF_STATE = 'C';
--注销状态的客户号
V_CIF_NO VARCHAR(20);
--是否存在待注销的账户
V_ACCT_EXIST NUMBER(20,0);
--是否存在待删除的证件映射
V_MAPPING_EXIST NUMBER(20,0);
BEGIN
OPEN cur_mkt_cif;
LOOP
FETCH cur_mkt_cif INTO V_CIF_NO;
EXIT WHEN cur_mkt_cif%NOTFOUND;
--循环所有分表
FOR C_NUM IN 0..29 LOOP
--根据客户号更新账号表
EXECUTE IMMEDIATE 'SELECT COUNT(1) FROM MKTPRD.MKT_CIF_ACCT_'||C_NUM||' WHERE CIF_NO = ?' INTO V_ACCT_EXIST USING V_CIF_NO;
IF V_ACCT_EXIST > 0 THEN
EXECUTE IMMEDIATE 'UPDATE MKTPRD.MKT_CIF_ACCT_'||C_NUM||' SET AC_STATE= ? WHERE CIF_NO = ?' USING V_STATE_CANCEL, V_CIF_NO;
END IF;
--根据客户号删除证件映射表
EXECUTE IMMEDIATE 'SELECT COUNT(1) FROM MKTPRD.MKT_CIF_IDNO_MAPPING_'||C_NUM||' WHERE CIF_NO= ?' INTO V_MAPPING_EXIST USING V_CIF_NO;
IF V_MAPPING_EXIST > 0 THEN
EXECUTE IMMEDIATE 'DELETE FROM MKTPRD.MKT_CIF_IDNO_MAPPING_'||C_NUM||' WHERE CIF_NO = ?' USING V_CIF_NO;
END IF;
END LOOP;
END LOOP;
COMMIT;
CLOSE cur_mkt_cif;
END;
标签:CIF,NO,--,游标,客户,EXIST,cur,变量,定义 From: https://www.cnblogs.com/tenWood/p/18333765