对于信息安全有要求的,在数据下发和同步过程中需要对含有用户身份信息的敏感字段脱敏,包括用户姓名、证件号、地址等等,下面是自定义函数的代码
create or replace function f_get_sensitive(in_str varchar, in_type number) return varchar2 is v_str_length number; v_name varchar2(1000); v_n number; v_hid varchar2(200); v_sql varchar2(200); v_num_flag number; /**** n_type 脱敏字段类型 1 :名称 11:地址 2 :证件 3 :银行账号 4 :联系电话 5 :接入号码 ***/ begin v_str_length := length(in_str); v_n := 0; if v_str_length=0 then return(null); end if; /**********名称和地址脱敏规则**********/ if in_type = 1 or in_type=11 then if v_str_length = 2 or v_str_length = 3 then v_name := regexp_replace(in_str, '(.)', '*', 2, 1); elsif v_str_length < 2 then v_name :=in_str; else while v_n < v_str_length / 2 loop v_n := v_n + 1; v_hid := v_hid || '*'; end loop; v_name := substr(in_str, 0, v_str_length / 2) || v_hid; end if; return(v_name); end if; /**********证件脱敏规则**********/ if in_type = 2 then if v_str_length = 15 then v_name := substr(in_str, 0, 6) || '******' || substr(in_str, -3, 3); elsif v_str_length = 18 then v_name := substr(in_str, 0, 6) || '********' || substr(in_str, -4, 4); else while v_n < v_str_length / 3 loop v_n := v_n + 1; v_hid := v_hid || '*'; end loop; v_name := substr(in_str, 0, v_str_length / 3) || v_hid || substr(in_str, -v_str_length / 3, v_str_length / 3); end if; return(v_name); end if; /**********银行账号脱敏规则**********/ if in_type = 3 then if v_str_length > 15 then v_name := substr(in_str, 0, 4) || '********' || substr(in_str, -4, 4); else v_name :=in_str; end if; return(v_name); end if; /**********联系电话脱敏规则**********/ if in_type = 4 then v_name := substr(in_str, 0, v_str_length - 4) || '****'; return(v_name); end if; /**********接入号码脱敏规则**********/ if in_type = 5 then v_sql := 'select count(1) from dual where length(''' || in_str || ''') = length(regexp_replace(''' || in_str || ''', ''[^0-9]''))'; execute immediate v_sql into v_num_flag; if v_num_flag = 1 and (v_str_length = 7 or v_str_length = 8) then v_name := substr(in_str, 0, 2) || '****' || substr(in_str, -2, 2); elsif v_num_flag = 1 and v_str_length = 11 then v_name := substr(in_str, 0, 3) || '*****' || substr(in_str, -3, 3); else v_name := in_str; end if; return(v_name); end if; return(in_str); exception when others then -- dbms_output.put_line('1'||v_sql); v_name := '-1'; return v_name; end f_get_sensitive;
总结
以上所述是www.887551.com给大家介绍的oracle自定义脱敏函数的代码详解,希望对大家有所帮助