Your trigger is way too complicated: you don't need the extra cursor, which just seems there to control whether a row exists or not - just run the statements without extra checking.
A somewhat simplified version would be:
create or replace trigger erptrain.trg_adm_user_update
after insert or update or delete
on erptrain.adm_user
for each row
declare
begin
if inserting
or updating
then
update dotcom.sm_employee
set emp_code = :new.user_id,
emp_name = :new.user_desc,
emp_cr_dt = :new.user_cr_dt,
emp_cr_uid = :new.user_cr_uid,
emp_lst_mod_dt = :new.user_upd_dt,
emp_freeze_flag = :new.user_frz_flag
where emp_code = :new.user_id;
if sql%rowcount = 0
then
insert
into dotcom.sm_employee (emp_code,
emp_name,
emp_cr_dt,
emp_cr_uid,
emp_lst_mod_dt,
emp_freeze_flag,
emp_approved
)
values (
:new.user_id,
:new.user_desc,
:new.user_cr_dt,
:new.user_cr_uid,
:new.user_upd_dt,
:new.user_frz_flag,
'N');
end if;
end if;
if deleting
then
delete from dotcom.sm_employee
where emp_code = :old.user_id;
end if;
end trg_adm_user_update;Actually it looks you need a unique constraint on dotcom.sm_employee.emp_code which probably s missing?