1. 程式人生 > 資料庫 >Oracle sql function 對資料進行處理

Oracle sql function 對資料進行處理

目錄

要求

用資料庫function實現資料處理

  1. 身分證字號:開發環境(DEV)至少遮5-8字元byte,使用者測試(UAT)環境之假資料若由測試單位自行編造輸入可不遮。
  2. 姓名(客戶之姓名、英文姓名、緊急聯絡人、代理人):中文至少遮第二中文字,英文至少遮第3-4字元(byte)。
  3. 地址:第七字(14 byte)起遮蔽。
  4. 出生年月日:隨機數加減五十天,隨機數不可取用0。如計算需要時,得不遮。
  5. 銀行(郵局賬號):至少遮第6-8字元 (byte)。賬號欄位存入資料庫時,需要先做轉碼處理,加密演算法採用DES.
  6. 信用卡號:至少遮第7-12字元 (byte)。卡號欄位存入資料庫時,需要先做轉碼處理,加密演算法採用DES.
  7. 電話:至少遮第6-8字元 (byte)。
  8. 電子郵件:至少遮第2-5字元 (byte)。
  9. 保單號碼:至少遮第5-8字元 (byte)。
  10. 放款賬號:至少遮第5-8字元 (byte)。
  11. 職業(服務機構、職務):遮蔽後2位字元(byte)
  12. 健康類(指紋、病歷、醫療、基因、性生活、健康檢查等):遮蔽不顯示原始資料,使用遮蔽的字元替換原始資料。
  13. 家庭類(婚姻、家庭、教育):遮蔽不顯示原始資料,使用遮蔽的字元替換原始資料。
  14. 犯罪前科、社會活動:遮蔽不顯示原始資料,使用遮蔽的字元替換原始資料。

實現

之前寫過身份證的,這次看大部分大同小異。先分類

  • 替換字元:1.2.3.7.8.9.10.11.
  • 替換+加密:5,6
  • 遮蔽全部替換:12.13.14.
  • 待定:4.
## 1.身份證號
create or replace function fIdNum(id varchar2)
return varchar2   
is   
Result varchar2(20); 
begin   
select replace(id,substr(id,5,length(id)-8),'*') into Result from dual;   
return(Result); 
end fIdNum;
--驗證
select fIdNum('111111222222223333') from dual

2.姓名

create or replace function fName(name varchar2)
return varchar2   
is   
Result varchar2(20);
begin   
 if  lengthb(name)=length(name)  then 
		select regexp_replace(name,'\w','*',3)into Result   from dual; 
return(Result);
  else
		
		select regexp_replace(name,'[^\x00-\xff]','*',2)into Result  from dual;
return(Result); 
  end if;
end fName;

--驗證
select fName('馬大姐') from dual

3.地址

create or replace function fAddress(address varchar2)
return varchar2   
is   
Result varchar2(20); 
begin   
select replace(address,substr(address,7),'*') into Result from dual;   
return(Result); 
end fAddress;
--驗證
select fIdNum('一二三四五六七八九十十一') from dual

4.出生年月日

待定,因為有別的任務,所以這個先擱置了

5.6.des加密,解密

create or replace function
encrypt_des(p_text varchar2, p_key varchar2) return varchar2 is
        v_text varchar2(4000);
        v_enc varchar2(4000);
        raw_input RAW(128) ;
        key_input RAW(128) ;
        decrypted_raw RAW(2048);
begin
        v_text := rpad( p_text, (trunc(length(p_text)/8)+1)*8, chr(0));
        raw_input := UTL_RAW.CAST_TO_RAW(v_text);
        key_input := UTL_RAW.CAST_TO_RAW(p_key);
        dbms_obfuscation_toolkit.DESEncrypt(input => raw_input,key => key_input,encrypted_data =>decrypted_raw);
        v_enc := rawtohex(decrypted_raw);
        dbms_output.put_line(v_enc);
    return v_enc;
end;

select encrypt_des('dsds','test#5&124*!de') from dual  ---加密測試
select decrypt_des('2B1DB64F882C68F9','test#5&124*!de')from dual ----解密測試
update tb_salarysign_staff s set s.staffpwd =encrypt_des(s.staffpwd, 'test#5&124*!de');----對錶內列加密-
select decrypt_des(s.staffpwd, 'test#5&124*!de') from tb_salarysign_staff s-----------解密
create or replace function decrypt_des(p_text varchar2,p_key varchar2) return varchar2 is
v_text varchar2(2000);                       
begin
    dbms_obfuscation_toolkit.DESDECRYPT(input_string => UTL_RAW.CAST_TO_varchar2(p_text),key_string =>p_key, decrypted_string=> v_text);
    v_text := rtrim(v_text,chr(0));
    dbms_output.put_line(v_text);
    return v_text;
end;

參考

5.銀行賬號

create or replace function fBankNum(bankNum varchar2)
return varchar2   
is   
Result varchar2(20); 
begin   
select replace(bankNum,substr(bankNum,6,4),'*') into Result from dual;   
return(Result); 
end fBankNum;

--驗證
select fBankNum(1111222233334444) from dual

6.信用卡號

create or replace function fCreditNum(creditNum varchar2)
return varchar2   
is   
Result varchar2(20); 
begin   
select replace(creditNum,substr(creditNum,7,5),'*') into Result from dual;   
return(Result); 
end fCreditNum;

--驗證
select fCreditNum('1111222233334444') from dual

7.電話

create or replace function fPhone(phone varchar2)
return varchar2   
is   
Result varchar2(20); 
begin   
select replace(phone,substr(phone,4,4),'*') into Result from dual;   
return(Result); 
end fPhone;

--驗證
select fPhone('19834526016') from dual

8.郵件

create or replace function fEmail(email varchar2)
return varchar2   
is   
Result varchar2(20); 
begin   
select replace(email,substr(email,2,5),'*') into Result from dual;   
return(Result); 
end fEmail;

--驗證
select fEmail('[email protected]') from dual

9.保單

create or replace function fGuarantee(guarantee varchar2)
return varchar2   
is   
Result varchar2(20); 
begin   
select replace(guarantee,substr(guarantee,5,4),'*') into Result from dual;   
return(Result); 
end fGuarantee;

--驗證
select fGuarantee('12345678') from dual

10.放款賬號

create or replace function fLoanAccount(account varchar2)
return varchar2   
is   
Result varchar2(20); 
begin   
select replace(account,substr(account,5,4),'*') into Result from dual;   
return(Result); 
end fLoanAccount;

--驗證
select fLoanAccount('12345678') from dual

11.職業

create or replace function fJob(job varchar2)
return varchar2   
is   
Result varchar2(20); 
begin   
select replace(job,substr(job,3),'*') into Result from dual;   
return(Result); 
end fJob;

--驗證
select fJob('美國總統') from dual

12.13.14 健康類,家庭類,犯罪前科,社會活動

create or replace function fHide(msg varchar2)
return varchar2   
is   
Result varchar2(20); 
begin   
select replace(msg,substr(msg,1),'*') into Result from dual;   
return(Result); 
end fHide;

--驗證
select fHide('美國總統') from dual