Connor and Chris will both be at AI World from October 12 to October 17 , the premier Oracle conference of 2025. If you're in Vegas, please come say Hi or pop into our sessions
Thanks for the question, Anand.
Asked: July 22, 2018 - 12:46 pm UTC
Last updated: July 24, 2018 - 10:55 am UTC
Version: 12c
Viewed 1000+ times
CREATE TABLE "XX_MASK_REF" ( "TABLE_NAME" VARCHAR2(150 BYTE), "COLUMN_NAME" VARCHAR2(150 BYTE), "FLAG" VARCHAR2(2 CHAR) DEFAULT 'N' );
Table_Name Column_Name Flag T1 C1 Y T1 C2 Y T1 C3 N T2 C1 N T2 C2 Y
Table_Name Column_Name Flag T1 C1 Y T1 C2 N T1 C3 N T2 C1 N T2 C2 Y
SQL> CREATE TABLE XX_MASK_REF 2 ( "TABLE_NAME" VARCHAR2(150 BYTE), 3 "COLUMN_NAME" VARCHAR2(150 BYTE), 4 "FLAG" VARCHAR2(2 CHAR) DEFAULT 'N' 5 ); Table created. SQL> SQL> insert into XX_MASK_REF values('T1','C1','Y'); 1 row created. SQL> insert into XX_MASK_REF values('T1','C2','Y'); 1 row created. SQL> insert into XX_MASK_REF values('T1','C3','N'); 1 row created. SQL> insert into XX_MASK_REF values('T2','C1','N'); 1 row created. SQL> insert into XX_MASK_REF values('T2','C2','Y'); 1 row created. SQL> SQL> set serverout on SQL> declare 2 l_sql varchar2(1000); 3 begin 4 for i in ( 5 select t.*, 6 row_number() over ( partition by table_name order by column_name ) r, 7 count(*) over ( partition by table_name ) c 8 from XX_MASK_REF t 9 where flag = 'Y' 10 order by 1,2 11 ) 12 loop 13 if i.r = 1 then 14 l_sql := 'update '||i.table_name||' set '||i.column_name||' = :b'||i.r; 15 end if; 16 if i.r = i.c then 17 if i.c > 1 then 18 l_sql := l_sql || ','||i.column_name||' = :b'||i.r; 19 end if; 20 dbms_output.put_line(l_sql); 21 else 22 l_sql := l_sql || ','||i.column_name||' = :b'||i.r; 23 end if; 24 end loop; 25 end; 26 / update T1 set C1 = :b1,C1 = :b1,C2 = :b2 update T2 set C2 = :b1 PL/SQL procedure successfully completed.
Check out more PL/SQL tutorials on our LiveSQL tool.
PL/SQL reference manual from the Oracle documentation library