Monday, July 27, 2009

ORACLE HATALARINI YAKALAMA

-- Veritabani'mizdaki sorgular çalisirken alinan hatalari asagidaki sorgu ile tespit edebiliriz.

-- Warning: compiled but with compilation errors bu uyariyi aldigimizda

-- show errors ile alinan hataliri görebiliriz. Ama asagida anlatmaya çalistigimda ayni isi yapacaktir.

-- Öncelik ile kendimize bir senaryo hazirlayalim. Senaryomuz su sekilde olsun.

-- bir paket yazdik ve içerisinde çesitli tablolar join islemi yapiyor temp tablolar olusturuyor.

-- Bir çesit ETL paketi diyebiliriz. Bu paket çesitli tablolardan select yapiyor yada içerisinde dinamik SQL'ler var

-- Kod dynamik sql e girdigi zaman hata aldi ve siz bu hatalari listelemek yada görmek istiyorsunuz.

-- Bu raporu hazirlamak için iki adet oracle View'ini joinlemek yeterli olacaktir.

-- öncelik ile all_source'den (USER_SOURCE,DBA_SOURCE de olur yetkinize göre artik.) hata alan kodu aliyoruz.

-- bunu daha sonra error'lerin USER_ERRORS (DBA_ERRORS,USER_ERRORS)oldugu görünüm ile joinliyoruz.

SELECT a.owner,

       a.TYPE,

       To_char(a.line)

       ||' - '

       ||a.text

       ||' - '

       ||b.text error

FROM     dba_source a,

         user_errors b

--çalisan isi burada belirtiyoruz.

--hangi isin hata aldigini bilmiyorsak bu kisimi açiklamaya çevirebiliriz.

WHERE a.NAME = 'AA'

         AND a.owner = b.owner

         AND a.NAME = b.NAME

         AND a.TYPE = b.TYPE

         AND a.line = b.line

ORDER BY a.NAME,

         a.line;

--bu isin aynisini show erros ile de yapabilirsiniz. Derleme isinden sonra hatalari bize gösterecektir.

--ÖRNEK BIR UYGULAMAYI HEMEN YAPALIM.

--hatali çalisacak bir procedure hazirlayalim.

SET SERVEROUTPUT ON;


CREATE OR REPLACE PROCEDURE Aa

IS

--burada degiskenimizi açiklama satiri yaptik. bu sebepten dolayi

--PLS-00201: identifier 'v_dynsql' must be declared

--degisken tanimlanmalidir. hatasini alacagiz.

--v_dynsql varchar2(200);

BEGIN

  v_dynsql := 'bu bir ekran ciktisidir.';

  

  dbms_output.Put_line(v_dynsql);

END;
SELECT   a.owner,

         a.TYPE,

         To_char(a.line)

         ||' - '

         ||a.text

         ||' - '

         ||b.text error

FROM     dba_source a,

         dba_errors b

WHERE    a.NAME = 'AA'

         AND a.owner = b.owner

         AND a.NAME = b.NAME

         AND a.TYPE = b.TYPE

         AND a.line = b.line

ORDER BY a.NAME,

         a.line;

--yukaridaki sorgu ile hatayi ve alinan hatanin geçtigi kod'u görenibiliriz.

--kodumuz düzeltip tekrar çalistirdigimizda

SET SERVEROUTPUT ON;


CREATE OR REPLACE PROCEDURE Aa

IS

  v_dynsql  VARCHAR2(200);

BEGIN

  v_dynsql := 'bu bir ekran ciktisidir.';

  

  dbms_output.Put_line(v_dynsql);

END;

--bu kez hatasiz derlenecegi için herhangibi bir hata almayacaktir.

--sorgu sonucuda null dönecektir.

No comments: