Использование слияния для достижения этой цели является хорошим подходом, но в вашем утверждении отсутствуют некоторые кавычки. Вот скрипка с примером, аналогичным тому, что вы пытаетесь сделать.
Из этой скрипки создайте тестовые данные:
create table table1(id varchar2(30), username varchar2(30), fullname varchar2(30));
create table table2(id varchar2(30), username varchar2(30), fullname varchar2(30));
insert into table1 values('a1', 'b1', 'c1');
insert into table1 values('a2', 'b2', 'c2');
insert into table1 values('a3', 'b3', 'c3');
insert into table1 values('a4', 'b4', 'c4');
insert into table2 values('a1', 'b1', 'c1');
insert into table2 values('a2', 'b2', 'c2');
insert into table2 values('a3', 'b3', 'c3');
Ваша функция:
CREATE OR replace PROCEDURE Table_sync(table_name IN VARCHAR2)
IS
stmnt CLOB;
BEGIN
stmnt := 'merge into ' || table_name || ' dest '
|| 'using (select id, username from table1) src '
|| 'on (dest.id = src.id) '
||
' when matched then update set dest.fullname = src.username || src.id '
|| ' where dest.username like ''%2'' '
|| ' when not matched then insert (id, username, fullname) values(src.id, src.id||src.username, src.username||src.username) '
;
EXECUTE IMMEDIATE stmnt;
END table_sync;
Если запись в таблице1 существует с тем же значением в столбце col1, что и столбец в таблице2, то она обновит ее на основе условия, если запись не существует, она вставит ее.
Вы можете написать все свои условия внутри оператора where и обратить внимание на двойные кавычки, используемые для цитирования значений в динамическом запросе c.