--***********************手机、座机打码函数****************************
①自动打码
--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;