Evde yaptıgım ufak bir exceptions örneğini anlatmak istedim. Birazda giriş sevyesinde fonksiyonlar ve ref cursor hakkında bilgi vermiş olacağım. Çok basit bir işlem yapan fonksiyon 3 kolondan oluşan tabloma ID verip diger bilgileri alan fonksiyon yazdım cursor döndürcem sonuç olarak. O zaman hemen fonksiyonu yazalım. Eger exception alırsam 1 parametresini yollicam.
CREATE OR REPLACE FUNCTION test
(
iid IN NUMBER,
ostatu OUT NUMBER
) RETURN SYS_REFCURSOR AS
TYPE v_cursor IS REF CURSOR;
p_cursor v_cursor;
verrormsg VARCHAR2(4000);
l_row VARCHAR2(200) := ”;
BEGIN
l_row := ’select * from deneme where ID = :iID’;
OPEN p_cursor FOR l_row
USING iid;
EXCEPTION
WHEN OTHERS THEN
ostatu := 1;
verrormsg := substr(SQLERRM, 1, 3000);
INSERT INTO log_data VALUES (iid, verrormsg, SYSDATE);
COMMIT;
RETURN p_cursor;
END;
Hemen ardından test ediyim bakalım data getiriyormu ?
DECLARE
refcursor SYS_REFCURSOR;
vid NUMBER;
vname VARCHAR2(100);
vn_statu NUMBER;
vil NUMBER;
BEGIN
refcursor := test(104022008230216, ostatu => vn_statu);
LOOP
FETCH refcursor
INTO vid, vname;
EXIT WHEN refcursor%NOTFOUND;
dbms_output.put_line(vid || ‘ | ‘ || vname);
END LOOP;
CLOSE refcursor;
END;
Getiriyor valla denedim gördüm. Sonra ne zorum varsa gidip select çektiğim tabloyu drop ettim. Dedimki o zaman log_data tablosu yapıyım da hatayı göriyim sanki bilmiyomuşum gibi:) Exception kısmından gelebilecek tüm exceptionlar için when others then kullandım. Sonra yine test ettim .
DECLARE
refcursor SYS_REFCURSOR;
vn_statu NUMBER;
BEGIN
refcursor := test(104022008230216, ostatu => vn_statu);
dbms_output.put_line(vn_statu);
CLOSE refcursor;
END;
OUT parametrem olan 1 gördüm ve merat edip gidip log tabloma baktım. Evet table or view doesn’t exist diyor allah allah ne oldu acaba:) Basit bir örnek göstermek istedim tabi bu arada yaptıgım eksikler de var hızlı yapıyım derken. Mesela paketin içine yazmalıydım fonksiyonu,dynamic sql ‘e gerek varmı ? vb.. ama dediÄŸim gibi örneklendirmek için basit bir örnek göstermek istedim.
> allah allah ne oldu acaba:)
multi-versioning? kyte chp 1
Bir ornek verelim, Kyte bu ornegi DROP degil DELETE ve akabinde COMMIT ile yapiyor kitabında. Bu ornek TRUNCATE ile calismiyor, biraz kafa karistiriyor esasinda DROP icerdigi satirlar icin UNDO olusturmuyor cunku DELETE gibi;
SQL> create table t1 as select * from all_objects where rownum variable x refcursor
for select * from t1;
SQL> — just opening, not fetching
SQL> begin
2 open
3 end;
4 /
PL/SQL procedure successfully completed.
SQL> drop table t1 purge;
Table dropped.
SQL> print x
OWNER OBJECT_NAME
—————————— ——————————
SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE
—————————— ———- ————– ——————-
CREATED LAST_DDL_T TIMESTAMP STATUS T G S
———- ———- ——————- ——- – - -
SYS ICOL$
20 2 TABLE
07/02/2006 07/02/2006 2006-02-07:22:10:16 VALID N N N
SYS I_USER1
44 44 INDEX
07/02/2006 07/02/2006 2006-02-07:22:10:16 VALID N N N
OWNER OBJECT_NAME
—————————— ——————————
SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE
—————————— ———- ————– ——————-
CREATED LAST_DDL_T TIMESTAMP STATUS T G S
———- ———- ——————- ——- – - -
ama yine de satirlar geliyor, fakat yogun DML olan bir ortamda bu sonucu elde etmek mumkun olmaz, denemelerimizde local bir veritabaninda tek calisan bir oturum iken bu sonucu gorebiliyoruz.
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:7502137879069#16419634532541
[...] to Baran for raising this problem. Tom Kyte has a similar example in his book but he uses DELETE and [...]
[...] [...]