Oracle sql function 對資料進行處理
阿新 • • 發佈:2021-01-13
目錄
要求
用資料庫function實現資料處理
- 身分證字號:開發環境(DEV)至少遮5-8字元byte,使用者測試(UAT)環境之假資料若由測試單位自行編造輸入可不遮。
- 姓名(客戶之姓名、英文姓名、緊急聯絡人、代理人):中文至少遮第二中文字,英文至少遮第3-4字元(byte)。
- 地址:第七字(14 byte)起遮蔽。
- 出生年月日:隨機數加減五十天,隨機數不可取用0。如計算需要時,得不遮。
- 銀行(郵局賬號):至少遮第6-8字元 (byte)。賬號欄位存入資料庫時,需要先做轉碼處理,加密演算法採用DES.
- 信用卡號:至少遮第7-12字元 (byte)。卡號欄位存入資料庫時,需要先做轉碼處理,加密演算法採用DES.
- 電話:至少遮第6-8字元 (byte)。
- 電子郵件:至少遮第2-5字元 (byte)。
- 保單號碼:至少遮第5-8字元 (byte)。
- 放款賬號:至少遮第5-8字元 (byte)。
- 職業(服務機構、職務):遮蔽後2位字元(byte)
- 健康類(指紋、病歷、醫療、基因、性生活、健康檢查等):遮蔽不顯示原始資料,使用遮蔽的字元替換原始資料。
- 家庭類(婚姻、家庭、教育):遮蔽不顯示原始資料,使用遮蔽的字元替換原始資料。
- 犯罪前科、社會活動:遮蔽不顯示原始資料,使用遮蔽的字元替換原始資料。
實現
之前寫過身份證的,這次看大部分大同小異。先分類
- 替換字元:1.2.3.7.8.9.10.11.
- 替換+加密:5,6
- 遮蔽全部替換:12.13.14.
- 待定:4.
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