Sabtu, 14 Juni 2014

ORA-02069: global_names parameter must be set to TRUE for this operation

Pernah mengalami error seperti itukah?
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;