jika anda menggunakan operasi DML terhadap sebuah database link maka mungkin anda akan mengalami hal tersebut.
Cause : You are trying to make DML operation on the remote database using local function.
artinya anda memakai sebuah lokal function untuk digunakan dalam proses DML.
contoh :
insert into mytable@mylink ( ename , nipeg , start_date , end_date) select ename , nipeg , get_start(nipeg) , get_end(nipeg) from emp;
Itu karena value dari global name database anda adalah false :
SELECT NAME, VALUE FROM V$PARAMETER WHERE NAME = 'global_names'
Biasanya developer bukan seorang DBA, maka solusi yang bisa pakai tanpa merubah value global name menjadi true adalah merubah proses DML dengan tidak memakai fungsi get_start,get_end secara langsung dalam proses insert. bisa memakai sebuah cursor atau collection. Merubah global name value menjadi TRUE juga memberi implikasi pada dblink yang lain, kemungkinan besar akan error jika tidak memakai nama link seperti global names db tujuan
Contoh dalam cursor :
begin for c_emp in ( select ename , nipeg , get_start(nipeg) start_date , get_end(nipeg) end_date from emp) loop insert into mytable@mylink ( ename , nipeg , start_date , end_date) values ( c_emp.ename , c_emp.nipeg , c_emp.start_date , c_emp.end_date); end loop; end;contoh dalam collection :
declare type t_emp is table of mytable@mylink%rowtype index by pls_integer; c_emp t_emp; begin select ename , nipeg , get_start(nipeg) start_date , get_end(nipeg) end_date bulk collect into c_emp; for i in c_emp.first .. c_emp.last loop insert into mytable@mylink ( ename , nipeg , start_date , end_date) values (c_emp(i).ename , c_emp(i).nipeg , c_emp(i).start_date , c_emp(i).end_date); end loop; end;
Catatan : anda tidak bisa memakai operasi forall thd database link;
Tidak ada komentar :
Posting Komentar