Söz ve ibareler, dinleyenler topluluğu için azık mesabesindedir.
Senin o azıktan nasibin ancak yediğin kadarıdır –İbni Arabi
Merhaba Arkadaşlar
object oriented programming oracle makalemize devam ediyoruz. (Bu işi sevdim, Yazıp duruyorum)
Bu makalemizde, bir object type oluşturacağız, bu object type”ı referans alan bir type list oluşturacağız.
Bir function ile bu listeyi doldurup geri donmesini saglayacagiz.
Bunun bize ne avantajı olacak peki:
cevap: bu function”ı tablo gibi kullanıp, select sorguları icerisine alabilecegiz;
bu sayede tablo veya view gibi dinamik bir kullanım saglayacak.
Sözü fazla uzatmadan; bunların nasıl yapılacağını anlatalım.
Önce type”ımızı create ediyoruz.
-- -- create or replace type t_key_value as object ( key varchar2(1000), value varchar2(4000), type varchar2(100), constructor function t_key_value(key varchar2, value varchar2) return self as result ); / -- --
type”ın body kısmını create ediyoruz. ve default constructor tanımlayıp,
cumartesi ve pazar günlerini tatil diye işaretlemesini saglayacagiz.
--
--
create or replace type body t_key_value is
constructor function t_key_value(key varchar2, value varchar2) return self as result is
begin
if key in (6, 7) then
self.type := 'Tatil';
else
self.type := 'İş Günü';
end if;
self.key := key;
self.value := value;
return;
end;
end;
/
--
--
Type”ımızı referans alan object type list tanımlamasını da yapalım.
-- -- create or replace type t_key_value_list as table of t_key_value; / -- --
evet artık isi yapacak function”ı da olusturalım.
kodun icine comment yazarak her satırı acıklamaya özen gösteriyorum.
--
--
create or replace function getKeyValueList return t_key_value_list is
v_kv t_Key_Value; -- oncelikle type degiskenimizi tanımlıyor
v_kv_list t_key_value_list := t_key_value_list(); -- key value type'ının listesini olusturmustuk onu tanımlıyoruz
v_day varchar2(10) := null; -- gunlerin isimlerini tutabilmek icin ayrı bir degisken tanımladık case fonksiyonu ile buna deger atayacağız
begin
-- WRITE TYPE
-------------------------------------------------
-- Yedi kez donecek bir for döngüsü oluşturuyoruz
--dbms_output.put_line('------ Deger Atama ------');
for r in 1 .. 7 loop
------------------------
-- gelen degere gore gunun ismi ilgili degiskene atilacak
case r -- r for dongusundeki donus degerini alır o yüzden ayrıca bir degisken tanımlamaya gerek yok
when 1 then
v_day := 'PAZARTESI';
when 2 then
v_day := 'SALI';
when 3 then
v_day := 'CARSAMBA';
when 4 then
v_day := 'PERSEMBE';
when 5 then
v_day := 'CUMA';
when 6 then
v_day := 'CUMARTESI';
when 7 then
v_day := 'PAZAR';
else
v_day := null; -- olmaz ama her zaman siz kodunuzu yazarken ELSE'yi düşünün ve yazın...
end case;
------------------------
-- oncelikle type degiskenimi dolduruyoruz....
/*
v_kv.key := r;
v_kv.value := v_day;
*/
-- constrotur devreye girsin diye new kewwordunu kullandim...
-- yukarıdak remark'ladıgım gibi kullansak ve declare kısmında initialize etseydik bu asamada constructor devreye girmezdi.
-- ilk ne zaman initialize edildiyse, constructor o zaman devreye girer.
v_kv := new t_Key_Value(r, v_day);
------------------------
-- object type listimizi extend edip, içine type basacağız.
v_kv_list.extend;
v_kv_list(v_kv_list.count) := v_kv; -- index vererek type'ı refere ediyoruz.
------------------------
end loop;
-- buraya kadar type'ı doldurduk ve type list'imize bu type'ları ekledik.
-- bundan sonra artık; olusturdugumuz type list'i function'dan geri donecegiz
return v_kv_list;
end getKeyValueList;
/
--
--
tanımlamalarımız tamam. Artık bunları kullanalım. Buyurun size bir kaç tane örnek. Bundan sonrasını sizin haya gücüne bırakıyorum. istediğiniz gibi kullanın…
-- -- diğer bir kullanım select * from table(getKeyValueList) a where a.type='İş Günü'; select * from table(getKeyValueList) a where a.type='Tatil'; -- --
Selam ve Dua ile…
@Cevheri

