Explicit Cursor
Explicit cursor’ler Fetch, Open ve Close edilebilirler.
Attributes:
| Cursor İsmi | Attribute | Kullanımı |
| cur_name | %found | cur_name%found |
| cur_name | %notfound | cur_name%notfound |
| cur_name | %isopen | cur_name%isopen |
| cur_name | %rowcount | cur_name%rowcount |
DML ve DDL
DML
| İşlem | Nasıl İşler? |
| Insert | Commit/Rollback |
| Update | Commit/Rollback |
| Delete | Commit/Rollback |
| Merge | Commit/Rollback |
DDL
| İşlem | Nasıl İşler? |
| Create | Auto Commit |
| Alter | Auto Commit |
| Drop | Auto Commit |
| Truncate | Auto Commit |
DDL işlemleri auto commit yapar. DML işlemleri ise commit ya da rollback yapılabilir.
TCL
| İşlem | |
| Commit | |
| Rollback | |
| Savepoint |
DCL
| İşlem | Nasıl İşler? |
| Grant | Auto Commit |
| Revoke | Auto Commit |
Force view , view farkı
İki view arasındaki tek fark eğer force view yaparsanız yazdığınız kod hatalı bile olsa create eder fakat invalid olarak create eder hatalıysa.
Normal view’da böyle bir durum söz konusu değil hatalıysa create işlemi yapılmaz.
Force View
CREATE OR REPLACE FORCE VIEW AKUZHAN.VIEW_DENEME (ID,NAME) AS SELECT ID , NAME FROM EMPLOYEES ;
Normal View
CREATE OR REPLACE FORCE VIEW AKUZHAN.VIEW_DENEME AS SELECT ID , NAME FROM EMPLOYEES ;
Raise application error verirken hata kodu, hatanın kendisi, ve son parametre olarak isterseniz hatanın stack trace’ini alabilirsiniz. True göndermek yeterli.
Böyle bir yapının olmadığını üzülerek söylüyorum
Sadece rollback için düşünülmüş bir yapı.
For X in yapısı
FOR X IN
(
SELECT
MDT.CH_DAY
, MDT.CH_MONTH
, MDT.CH_YEAR
FROM
AKUZHAN.TABLE MDT
WHERE
MDT.CH_DAY IS NOT NULL
AND MDT.CH_MONTH IS NOT NULL
AND MDT.CH_YEAR IS NOT NULL
)
LOOP
V_MONTH_LOWER := LOWER(X.CH_MONTH);
CASE V_MONTH_LOWER
WHEN ‘ocak’ THEN V_MONTH := ’01′;
WHEN ‘subat’ THEN V_MONTH := ’02′;
WHEN ‘mart’ THEN V_MONTH := ’03′;
WHEN ‘nisan’ THEN V_MONTH := ’04′;
WHEN ‘mayis’ THEN V_MONTH := ’05′;
WHEN ‘haziran’ THEN V_MONTH := ’06′;
WHEN ‘temmuz’ THEN V_MONTH := ’07′;
WHEN ‘agustos’ THEN V_MONTH := ’08′;
WHEN ‘eylul’ THEN V_MONTH := ’09′;
WHEN ‘ekim’ THEN V_MONTH := ’10′;
WHEN ‘kasim’ THEN V_MONTH := ’11′;
WHEN ‘aralik’ THEN V_MONTH := ’12′;
ELSE V_MONTH := NULL;
END CASE;
END LOOP;
Herhangi bir değer ile null değer karşılaştırma vb. lojik işlemlere ya da aritmetik işlemlere tabi tutulamıyor.Aşağıdaki örnekte null sting değer ile içinde Abdullah yazan string değer karşılaştırılamıyor.
declare
v_karsilastir varchar2(10):=’abdullah’;
v_tut varchar2(5);
v_deger number;
bool boolean ;
begin
select
case
WHEN V_TUT IS NULL THEN 4
when v_tut=” then 1
when v_tut=null then 2
else 3
end
into v_deger
from dual;
dbms_output.put_line(‘değer :’||v_deger);
if v_tut<>v_karsilastir then
bool:=true;
else
bool:=false;
end if;
dbms_output.put_line(‘bool :’|| case when bool = true then ‘true’ when bool=false then ‘false’end );
end;
çözümü ise aşağıdaki gibi ya da farklı şekillerde olabilir.
declare
v_karsilastir varchar2(10):=’abdullah’;
v_tut varchar2(5);
v_deger number;
bool boolean ;
begin
select
case
WHEN V_TUT IS NULL THEN 4
when v_tut=” then 1
when v_tut=null then 2
else 3
end
into v_deger
from dual;
dbms_output.put_line(‘değer :’||v_deger);
if v_karsilastir<>nvl(v_tut,’ ‘) then
bool:=true;
else
bool:=false;
end if;
dbms_output.put_line(‘bool :’|| case when bool = true then ‘true’ when bool=false then ‘false’end );
end;
Yazılan dinamik sql’in valid olup olmadığı kontrol etmek için aşağıdaki gibi bir fonksiyon kullanabilirsiniz.
CREATE OR REPLACE FUNCTION AKUZHAN.IS_VALID_QUERY
(
P_SQL VARCHAR2
)
RETURN BOOLEAN IS
V_CURSOR PLS_INTEGER;
BEGIN
V_CURSOR := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(V_CURSOR, P_SQL, DBMS_SQL.NATIVE);
DBMS_SQL.CLOSE_CURSOR(V_CURSOR);
RETURN TRUE;
EXCEPTION WHEN OTHERS THEN
RETURN FALSE;
END;
/
Deyim tutamacı çalışmıyor hatası:
Bazı durumlarda kontrol yapılır ve arkasından bir out cursor varsa open edilir. Ya koşul sağlanmaz ve cursor içine girilmezse ne olur ? ya exception’a düşmüşsek?
Bu durumda aslında alınan hatayı deyim tutamacı çalışmıyor hatası ezer ve aslında gerçek hatayı göremezsiniz.
Bunu engellemek için
EXCEPTION
WHEN OTHERS THEN
OPEN P_CURSOR_SEARCH FOR SELECT NULL FROM DUAL;
Gibi bir yapı kullanarak aşabilirsiniz. Şimdiye kadar başınıza gelmemiş olabilir ama geldiğinde çok yardımcı olacak bir not.
İyi çalışmalar.
follow: