Data masking in Oracle SQL select statement

23k Views Asked by At

Without using PL/SQL, is it possible to do data masking in SELECT statement?

For example:

(AS-IS) SELECT 'this is a string' from DUAL;

this is a string

(TO-BE) SELECT 'this is a string' from DUAL;

xxxx xx x xxxxxx

2

There are 2 best solutions below

0
On BEST ANSWER

REGEXP_REPLACE can do this:

SELECT REGEXP_REPLACE('this is a string', '\w', 'x') FROM DUAL;

This replaces all non-whitespace characters with an x. To replace letters only, try this:

SELECT REGEXP_REPLACE('this is a string', '[A-Za-z]', 'x') FROM DUAL;
0
On

You can create user defined function as below and call that function in your query to mask the data.

create or replace function scrubbing(word in varchar2)
return varchar2
as
each_var char(2);
final_val varchar2(100);
complete_data varchar2(4000);
each_word varchar2(1000);
cursor val is select substr(replace(word,' ','#'),-level,1)  from dual connect by level<=length(word);
begin
open val;
--final_val:= '';
loop
    fetch val into each_var;
    exit when val%NOTFOUND;
    --dbms_output.put_line(each_var);
    final_val := trim(final_val)||trim(each_var);
    --dbms_output.put_line(final_val);
    select regexp_substr(final_val,'[A-Za-z]+') into each_word from dual;
    select replace(translate(final_val,each_word,dbms_random.string('L',length(word))),'#',' ') into complete_data from dual;
end loop;
return complete_data;
end;