oracle 手机、身份证 打码 函数

--***********************手机、座机打码函数****************************

①自动打码

--select  REPLACE_ASTERISK1(13174250698) from dual;

--字符串打码函数[字符串长度在7-32之间]
--小于7个字符,返回原字符串,不执行打码,大于32个字符,则取左边32个字符
CREATE OR REPLACE FUNCTION REPLACE_ASTERISK1(
VAR_STR IN VARCHAR2,RATE_NUM IN NUMBER DEFAULT 0.36)
RETURN VARCHAR2
IS

VAR_STR_TEMP VARCHAR2(32);--临时字符串
RET_STR VARCHAR2(32);--返回字符串
VAR_LEN NUMBER(2,0); --字符串长度
VAR_RATE NUMBER(3,2):=0.36; --字符串替换比率(小于0.45)
REPLACE_STR VARCHAR2(32); --可替换的字符串

BEGIN

VAR_RATE:=RATE_NUM;

--判断长度(小于7个返回原字符,大于32个只截取左边32个字符)
IF LENGTH(VAR_STR)>6  THEN
    IF LENGTH(VAR_STR)>32 THEN
        VAR_STR_TEMP:=SUBSTR(VAR_STR,1,32);
    ELSE
        VAR_STR_TEMP:=VAR_STR;
    END IF;
ELSE
    --小于7个返回原字符串
    RETURN VAR_STR;
END IF;

--得到字符串长度
VAR_LEN:=LENGTH(VAR_STR_TEMP);

--找到需要替换的字符串
RET_STR:=SUBSTR(VAR_STR_TEMP,VAR_LEN-2*ROUND(VAR_LEN*VAR_RATE)+1,ROUND(VAR_LEN*VAR_RATE));
--替换的*号
REPLACE_STR:=SUBSTR(LPAD('*',32,'*'),0,ROUND(VAR_LEN*VAR_RATE));

RET_STR:=REPLACE(VAR_STR_TEMP,RET_STR,REPLACE_STR);


RETURN RET_STR;

END;
/

②指定位置打码
--从第3个位置打码到第6个位置,共4个字符打码
--select REPLACE_ASTERISK2(123456789,3,6) from dual;

--字符串在指定位置打星号
--参数(打码的字符串,打码开始位置[最小从1开始],打码结束位置[需>=开始位置])
create or replace FUNCTION REPLACE_ASTERISK2(
VAR_STR IN VARCHAR2,B_NUM IN NUMBER,E_NUM IN NUMBER)
RETURN VARCHAR2
IS

--最长支持32个字符,可修改下面32的值,使支持更长的字符串
VAR_STR_TEMP VARCHAR2(32);    --临时字符串
RET_STR VARCHAR2(32);        --返回字符串
REPLACE_STR VARCHAR2(32);     --可替换的字符串

VAR_LEN NUMBER(2,0);         --字符串长度

BEGIN

--当结束位置小于开始位置,则不打码
IF E_NUM<B_NUM THEN
    RETURN VAR_STR;
END IF;

--判断长度小于指定范围,则返回全部*号
IF LENGTH(VAR_STR)<=(E_NUM-B_NUM+1) THEN
    --返回全部*号
    RETURN LPAD('*',LENGTH(VAR_STR),'*');
END IF;

--空值,返回空
IF VAR_STR IS NULL THEN
  RETURN '';
END IF;

VAR_STR_TEMP:=VAR_STR;

--得到字符串长度
VAR_LEN:=LENGTH(VAR_STR_TEMP);

--找到需要替换的字符串(字符串,开始位置,长度)
RET_STR:=SUBSTR(VAR_STR_TEMP,B_NUM,E_NUM-B_NUM+1);

--替换的*号(字符串,开始位置,长度) 最长支持32个字符
REPLACE_STR:=SUBSTR(LPAD('*',LENGTH(VAR_STR_TEMP),'*'),B_NUM,E_NUM-B_NUM+1);

RET_STR:=REPLACE(VAR_STR_TEMP,RET_STR,REPLACE_STR);

RETURN RET_STR;

END;
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值