----------------------Oracle函数脱敏-----------------------------------
CREATE OR REPLACE FUNCTION FUN_CARD_ID_TRANS(IN_CARD_ID VARCHAR2)
RETURN VARCHAR2 IS
V_CARD_ID VARCHAR2(20);
BEGIN
/**
传入身份证号,返回脱敏后数据
入参说明: 18位身份证号
出参说明: 脱敏后的身份证号
*/
IF IN_CARD_ID IS NOT NULL AND LENGTH(IN_CARD_ID)=18 THEN
V_CARD_ID:='*******'||SUBSTR(IN_CARD_ID,7,8)||'****';
ELSIF IN_CARD_ID IS NOT NULL AND LENGTH(IN_CARD_ID)=15 THEN
V_CARD_ID:=SUBSTR(IN_CARD_ID,1,3)||'********'||SUBSTR(IN_CARD_ID,12,4);
ELSIF IN_CARD_ID IS NOT NULL THEN
V_CARD_ID:='********'||SUBSTR(IN_CARD_ID,-4);
END IF;
RETURN V_CARD_ID;
END FUN_CARD_ID_TRANS;
CREATE OR REPLACE FUNCTION FUNC_NAME_TM(CUST_NAME VARCHAR2) RETURN VARCHAR2 IS
V_CUST_NAME VARCHAR2(20);
V_CUST_STAR VARCHAR2(20);
V_START_NUM NUMBER;
BEGIN
/**
传入姓名,返回脱敏后数据
入参说明: 姓名
出参说明: 脱敏后的姓名
脱敏规则:两个字的姓名保留第一个字,两个字以上的姓名保留第一个字和最后一个字,中间用*
*/
V_START_NUM := 1;
IF CUST_NAME IS NOT NULL AND LENGTH(CUST_NAME) = 2 THEN
V_CUST_NAME := '*' || SUBSTR(CUST_NAME, -1);
ELSIF CUST_NAME IS NOT NULL AND LENGTH(CUST_NAME) > 2 THEN
--根据名字的长度确定‘*’的数量
WHILE V_START_NUM <= LENGTH(CUST_NAME) - 2
LOOP
V_CUST_STAR := V_CUST_STAR || '*';
V_START_NUM := V_START_NUM + 1;
END LOOP;
V_CUST_NAME := SUBSTR(CUST_NAME, 1, 1) || V_CUST_STAR ||
SUBSTR(CUST_NAME, -1);
END IF;
RETURN V_CUST_NAME;
END FUNC_NAME_TM;
----------------------邮储银行Oracle常规脚本书写-----------------------
CREATE OR REPLACE PROCEDURE PRO4_KJZF_EWM_TEST(IN_DATE VARCHAR2)
IS
V_PRO_NAME VARCHAR2(63); --过程名字
V_STEP NUMBER;
V_DATE VARCHAR2(8);
V_SQL VARCHAR2(4000);
ERR_MSG VARCHAR2(4000);
v_month_first_date VARCHAR2(200);
v_month_last_date VARCHAR2(200);
v_date_month VARCHAR2(200);
V_SUBSTRING VARCHAR2(200);
BEGIN
/**
需求:快捷支付二维码引荐人
开发者:zxb
开发时间:2020年7月30日
入参说明: v_date 抽取时间 yyyy-mm-dd
*/
V_DATE := REPLACE(IN_DATE, '-', '');
V_SUBSTRING := SUBSTR(V_DATE,0,6);
V_STEP := 0;
V_PRO_NAME := 'PRO4_KJZF_EWM_TEST';
IF (V_STEP = 0) THEN
SP_INSERT_LOG(V_PRO_NAME, V_STEP, V_DATE, '1'); --记录日志
dbms_output.put_line(v_month_first_date);
SP_INSERT_LOG(V_PRO_NAME, V_STEP, V_DATE, '2'); --记录日志
V_STEP := V_STEP + 1;
END IF;
IF (V_STEP = 1) THEN
SP_INSERT_LOG(V_PRO_NAME, V_STEP, V_DATE, '1'); --记录日志
V_SQL := 'TRUNCATE TABLE t4_kjzf_ewm_mx_1';
EXECUTE IMMEDIATE V_SQL;
--插入更新操作需要commit;
SP_INSERT_LOG(V_PRO_NAME, V_STEP, V_DATE, '2');
V_STEP := V_STEP + 1;
END IF;
EXCEPTION
WHEN OTHERS THEN
ERR_MSG := SQLERRM;
SP_INSERT_LOG(V_PRO_NAME, V_STEP, ERR_MSG, 'e');
RAISE_APPLICATION_ERROR('-20000', SQLERRM);
END PRO4_KJZF_EWM_TEST;
----------------------------------自行判断上游数据是否满足执行条件-------------------------------------------
IF (V_STEP = 0) THEN
SP_INSERT_LOG(V_PRO_NAME, V_STEP, V_DATE, '1'); --记录日志
--0.1 取来源表和结果表的最大日期
SELECT to_char(max(t.etl_job_dt),'yyyy-mm-dd') into wallet_date FROM cpddp_pdata.dcep_wallet_per t; --个人钱包表
union all
SELECT to_char(max(t.etl_job_dt),'yyyy-mm-dd') into wallet_dj_date FROM cpddp_pdata.wallet_acc_reg_per t;--个人钱包登记表
SELECT max(report_time) into jg_maxdate FROM cust_jb_szrmb_step4 ; --20210705 2021-07-05
dbms_output.put_line('结果表最大日期:'||jg_maxdate);
--0.2 根据参数判断数据执行日期,如果参数无效根据结果表日期去计算;
if (v_date is null or v_date = '') then
-- 判断结果日期是否为空,为空则赋值铺底日期上个周期的数据
if (jg_maxdate is null or jg_maxdate = '') then
jg_maxdate := '2021-08-23';
end if ;
-- 计算下一次执行日期
select to_char(to_date(jg_maxdate,'yyyy-MM-dd')+1,'yyyy-MM-dd') into next_exec_date FROM DUAL;
else
next_exec_date := v_date;
end if;
dbms_output.put_line('执行日期为: '||next_exec_date);
--0.3 比较执行日期和源表日期,不符合要求不执行
if (next_exec_date > wallet_date or next_exec_date > wallet_dj_date ) then
dbms_output.put_line('不执行');
V_STEP := V_STEP + 100;
dbms_output.put_line('不正常执行,执行的步数:'||V_STEP);
else
dbms_output.put_line('执行');
end if;
-- 需要使用去掉“-’的日期
dbms_output.put_line('执行日期为: '||next_exec_date);
next_exec_date_trim := replace(next_exec_date,'-','');
dbms_output.put_line('执行日期去掉‘-’为: '||next_exec_date_trim);
dbms_output.put_line('个人钱包表最大日期为: '||wallet_date);
dbms_output.put_line('个人钱包登记表: '||wallet_dj_date);
SP_INSERT_LOG(V_PRO_NAME, V_STEP, V_DATE, '2'); --记录日志
V_STEP := V_STEP + 1;
END IF;
oracle经典存储过程、函数
于 2022-03-05 00:02:30 首次发布