oracle经典存储过程、函数

----------------------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;
  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值