">

Oracle Veritabanında Kelime Arama

Oracle Veritabanında Kelime Arama

Merhaba Arkadaşlar,

Oracle veritabanında bulunan datalar içerisinden bir kelime yada bir metin aramak istediğinizde aşağıdaki procedure'yi kullanabilirsiiz :) kesinlikle çalışıyor ve hatta yaklaşık 6 TB boyutundaki bir veritabanımızda denedik yaklaşık 6 saat de tüm taramayı bitirdi ve bize hangi tablonun, hangi kolonunda verinin olduğunu söyledi.

tabi bu procedureyi dereleyip tabloyu create ettikten sonra undo retantion parameteresini biraz artırmanızı tavsiye ederim çünkü çok büyük tablolarınızda select biraz zaman alıyor bu sebebden dolayı snapshot too old hatasına takılmayın.

 

öncelikle yapmanız gereken ilk şey aşağıdaki tabloyu oluşturmak.

create table ARANAN_DATA

(

  owner       VARCHAR2(50),

  table_name  VARCHAR2(30),

  column_name VARCHAR2(50),

  notu        VARCHAR2(255),

  tarih       DATE default sysdate

); 

 

Sonrasında aşağıdaki procedureyi derleyiniz.

create or replace procedure KayitArama(p_varchar_aranacak in varchar2 default null) is

  string1 varchar2(4000);

  l_sonuc VARCHAR2(32767) := NULL;

begin

  for rec in (select *

                from dba_tab_cols t

               where t.OWNER = 'CRMANALYSE'

                 and t.DATA_TYPE in ('VARCHAR2')) loop

    begin

      string1 := 'select ' || rec.column_name || ' from crmanalyse' || '.' ||

                 rec.table_name || ' where ' || 'upper(' || rec.column_name || ')' ||

                 ' like ' || 'upper(' || '''' || p_varchar_aranacak || '''' || ')' || '';

      execute immediate string1

        into l_sonuc;

      if l_sonuc is not null then

         insert into aranan_data values (rec.owner,rec.table_name,rec.column_name,l_sonuc,sysdate);

         commit;

        /*dbms_output.put_line(rec.owner || '.' || rec.table_name || '.' ||

                             rec.column_name || ' : ' || l_Sonuc);*/

      end if;

    exception

      when no_data_found then

        null;

      when too_many_rows then

        insert into aranan_data values (rec.owner,rec.table_name,rec.column_name,'Aranan sonuc kolonda birden fazla kez geçmektedir',sysdate);

        commit;

        /*dbms_output.put_line(rec.owner || '.' || rec.table_name || '.' ||

                             rec.column_name || ':' ||

                             'bu kolonda aranan deger birkac kez gecmektedir.');*/

      when others then

        insert into aranan_data values (rec.owner,rec.table_name,rec.column_name,l_sonuc,sysdate);

        /*dbms_output.put_line(rec.owner || '.' || rec.table_name || '.' ||

                             rec.column_name || '.' ||

                             'Beklenmedik Bir durum olustu');*/

      commit;

    end;

  end loop;

end;

 

Procedure sağ salim derlendiyse aşağıdaki şekilde test edebilirsiniz :)

begin

  -- Call the procedure

  KayitArama('engin');

end;

 

Umarım Faydalı olmuştur...

 

Yorumlar

Henüz yorum yapılmadı.

Yorum Yapın