-- 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.
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment