ORACLE PL/SQL OBJECT TYPE 6 SELECT * FROM TABLE(

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…

Capture

--
-- 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

 

 

ORACLE PL/SQL – OBJECT TYPE – 5 USING INSERT INTO

Hırsı bırak, kendini boş yere harcama.
Şu toprak altında çırak da bir, usta da –Mevlana

Merhaba Object Oriented Oracle yazımıza devam ediyoruz.

Bu yazımızda, object type’ları tabloya veya tablonun column’larına referans verme ve buralara, kayıt ekleme ile ilgili çok güzel örnekler yapacağız. Program yazarken oluşturduğunuz ve kullandığımız tipleri, hiç bir tip dönüşümüne sokmadan, olduğu gibi veritabanına kaydedip, okumaya başlayınca, Objelerle çalışmanın lezzetini tadacaksınız.

Öncelikle personType ve personInventory diye iki tane obje oluşturuyorum. birinde personel bilgileri, diğerinde, personel envanter bilgileri. Personel ve Envanter içeriği(özelliği) çok sık değişmeyeceği için, tüm ihtiyaç olacak alanlar oluşturup, bunları column tipi olarak vereceğiz.

Tip ve tablomuzu oluşturalım.

Person Bilgileri Object Type:

-- person icin uygun object type oluşturulur..
create or replace type personType as object
(
  firstname varchar2(100),
  lastname  varchar2(100),
  mail      varchar2(100),
  phone     varchar2(20)
)
;
/

Person Envanter Bilgisi Object Type:

-- personel envanteri icin uygun type oluşturulur.
create or replace type personInventory as object
(
  inventoryname varchar2(100),
  inventorytype varchar2(20)
);
/

Şimdi de bu type’ları referans alan tablomuzu oluşturalım:

-- person icin tabloyu object type'larımızla create ediyoruz
-- direk o tipleri insert edeceğiz.
create table personTab (
person       personType,
invontory    personInventory
);

Eveet yukarda gördüğünüz gibi; tablomuzun iki kolonu var; ama içlerinde onlarca, yüzlerce özellik olabilir. Peki güzel, iyi be kardeşim bunu biz nasıl kullanacağız, hadi, insert ve select deneyelim.(sanki okuyanlar hiç select-insert bilmiyor ya…)

insert into personTab values (
personType('Ali','Sormaz','ali@sormaz.com','02122122112'),
personInventory('Bilgisayar', 'TEKNIK')
);

insert into personTab values (
personType('Veli','Yormaz','veli@yormaz.com','3122122112'),
personInventory('Paspas', 'TEMIZLIK')
);

commit;

Evet dediğiniz gibi insertin hiç farkı yok, aslında şuna benzer : insert into table_name select * from filanca_table;

son bombamızı patlatıp, select sorgumuzu da yazıyoruz…………

Capture

Sorgu sonucuna dikkat ettiyseniz, bir kişinin adını çekmek istiyorsak = personTab.Person.Firstname şeklinde bir tree yapısı kuracağız. bu tree yapısı istediğiniz kadar içeri gidebilir.

Object Type’ların tablolarla ilişkisini inceleyemeye çalıştık; bu konuda makalelerimiz devam edecek. Dilimiz döndüğünce, parmaklarımız yazdığınca bu konuları anlatmaya çalışacağız.

Selam ve Dua ile…

 

ORACLE PL/SQL – OBJECT TYPE – 4 USING INHERITANCE

Misafirsin Bu Hanede Ey Gönül,
Umduğunla Değil , Bulduğunla Gül..
Hane Sahibi Ne Derse O Olur,
Ne Kimseye Sitem Eyle , Ne de Üzül –Mevlana

Merhaba Dostlar

Object – Oriented Oracle konumuzun dördüncü makalesindeyiz. Bu makalede sizlere, OOP programlamanın olmazsa olması inheritance (kalıtım, miras alma) özelliğinin plsql de nasıl kullanılacağını anlatacağım. Buraya kadar anlattığımız makaleler daha basic konulardı, artık object type’ın enterprise özelliklerini incelemeye başlıyoruz.  Burada OOP nin inheritance özelliğini açıklamaya kalkmayacağım. bunu bildiğinizi varsayıyorum. (Buradan inceleyebilirsiniz)

Bu yazımda, mesaj yapısı kurdum. bir BaseMessage type’ım var. Bu type bir mesaj’da olmazsa olmaz özellikleri(en base) barındıracak; ancak bundan, hata mesajı ve başarılı mesaj gibi iki tane daha type türeteceğiz. Base type’ta print diye bir metod var, doldurulan mesaj içeriklerini ekrana yazdıran metod. bu metodu, hem başarılı mesaj, hemde hata mesajlarına tek tek yazmıyoruz. Base type’ta yapmamız yeterli.

Miras alma UNDER keywordü ile yapılmaktadır. aşağıda örneğimizde görülecektir.

Şimdi objelerimi create edelim sırasıyla

Önce Base Type’ı create edelim. İçinde iki tane constructor var.  Bu constructor’ların amacı, bu objeleri, istersek parametre vererek, istersekte, parametre vermeden çağrılabilmesini sağlamaktır.

SuccessMessage();

SuccessMessage(mesajkodu, mesajicerigi);

Not: create ederken force keywordunu kullandım. bunun amacı, bu objeyi referans alan başka objeler varsa, replace etmeye kalktığınızda uyarı verir. yani en alttaki oğul kaydı droplanmadan, üstteki obje değiştirilemez(spec tarafı). body kısmında böyle bir kısıt yok.

create or replace type BaseMessageType force as object
(
  Code    varchar2(20),
  Message varchar2(4000),
  constructor function BaseMessageType return self as result,
  constructor function BaseMessageType(p_code varchar2, p_message varchar2) return self as result,
  member procedure print
)
not final -- Miras alınabilecek bir type oluşturmuş olduk
/

create or replace type body BaseMessageType is

  -- ilk deger ataması default degerler ile yapılıyor.
  constructor function BaseMessageType return self as result is
  begin
    self.Code    := '00000';
    self.Message := 'NULL';
    return;
  end;

  -- parametre olarak gelenler code ve message kısmına atanıyor
  constructor function BaseMessageType(p_code varchar2, p_message varchar2) return self as result is
  begin
    self.Code    := p_code;
    self.Message := p_message;
    return;
  end;
  member procedure print is
  begin
    dbms_output.put_line('Mesaj Kodu  :' || self.Code);
    dbms_output.put_line('Mesaj Icerik:' || self.Message);
  end;
end;
/

Başarılı Message Type’ı oluşturalım. code , message ve print özelliklerini base’den alacak şekilde tasarlıyoruz.

create or replace type SuccessMessage under BaseMessageType
(
  -- normalde mesaj tipini de  base type'ta tanımlayabilirdik; ama burda da bir property olsun istedim.
  MessageType varchar2(20),
  constructor function SuccessMessage return self as result,
  constructor function SuccessMessage(p_code varchar2, p_message varchar2) return self as result
)
/

create or replace type body SuccessMessage is

  constructor function SuccessMessage return self as result is
  begin
    self.MessageType    := 'SUCCESS';
    self.Code           := '00001';
    self.Message       	:= 'SUCCESSFUL';
    return;
  end;

  constructor function SuccessMessage(p_code varchar2, p_message varchar2) return self as result is
  begin
    self.MessageType    := 'SUCCESS';
    self.Code           := p_code;
    self.Message        := p_message;
    return;
  end;

end;
/

Aynı mantıkla Hata Mesajı Type’ımızıda oluşturalım

create or replace type ErrorMessage under BaseMessageType
(
  -- normalde mesaj tipini de  base type'ta tanımlayabilirdik; ama burda da bir property olsun istedim.
  MessageType varchar2(20),
  constructor function ErrorMessage return self as result,
  constructor function ErrorMessage(p_code varchar2, p_message varchar2) return self as result
)
/
create or replace type body ErrorMessage is

  constructor function ErrorMessage return self as result is
  begin
    self.MessageType    := 'ERROR';
    self.Code           := '00003';
    self.Message        := 'GENERAL ERROR';
    return;
  end;

  constructor function ErrorMessage(p_code varchar2, p_message varchar2) return self as result is
  begin
    self.MessageType    := 'ERROR';
    self.Code           := p_code;
    self.Message        := p_message;
    return;
  end;

end;
/

BaseMessageType oluşturduk,

SuccessMessage ve ErrorMessage bundan türedi. ve üst objenin tüm özelliklerini kullanabilecek hale geldi.

şimdi örnek kodumuzu yazalım. yani bunları çalıştıralım. ve bakalım nasıl bir output ortaya çıkacak.

Not : print kullanımına dikkat edelim.

Tabi iserror diye bir değişken tanımladım. amaç program içinde hata oluştuğunda bunu setleyeceğim ve buna göre uygun message’ı çağıracağım.

-- Created on 20.05.2015 by cevheri 
declare
  error   ErrorMessage;
  succes  SuccessMessage;
  iserror boolean := true;
begin

  -- Hayal gucumuzu kullanarak;
  -- burada zilyon tane(baya bi çok demek) 
  -- iş yapan kod calıştığını düşünüyoruz
  -- hata oluşmassa burası çalışacak
  if iserror then
  
    -------------------------------------------------------------------------
    dbms_output.put_line('----------------------------');
    dbms_output.put_line('Hata yok default başarılı mesajı dönsün');
  
    -- type'ımızda constructor olduğu için
    -- default değerleri kullacağız
    succes := SuccessMessage;
    succes.print;
  
    dbms_output.put_line('----------------------------');
    dbms_output.put_line('Hata yok, Kullanıcıya Afferin desin');
  
    -- type'ımızda constructor olduğu için
    -- parametre almasını sağlayacağız
    succes := SuccessMessage('00001', 'Afferin Güzel Çalıştırdın');
    succes.print;
    -------------------------------------------------------------------------
  end if;

  iserror := false; -- artık hata yok 🙂 düzeldi
  if (not iserror) then
    
    -------------------------------------------------------------------------
    -- Yine Hayal gucumuzu kullanarak;
    -- burada zilyon tane(baya bi çok demek) 
    -- iş yapan kod calıştığını ve hata meydana geldiginde de 
    -- bu satırın çalışacağını düşünüyoruz.
    
    dbms_output.put_line('----------------------------');
    dbms_output.put_line('Hata oluştuğunu anlayalım yeter');
    error := ErrorMessage;
    error.print;
  
    dbms_output.put_line('-------------------------------------');
    dbms_output.put_line('Hatanın sebebini biliyoruz. Yakaladık');
    error := ErrorMessage('00002', 'Tabloya kayıt eklenirken Hata olustu.');
    error.print;
    -------------------------------------------------------------------------
  end if;

end;
/

Şimdi de çıktısına bir göz atalım mı
——————————————————————-

mesaj, dışardan parametre vermeden çağrıldığında
Hata yok default başarılı mesajı dönsün
Mesaj Kodu :00001
Mesaj Icerik:SUCCESSFUL
——————————————————————-

mesaj ve code, dışardan parametre verilerek çağrılırsa
Hata yok, Kullanıcıya Afferin desin
Mesaj Kodu :00001
Mesaj Icerik:Afferin Güzel Çalıştırdın
——————————————————————-

mesaj, dışardan parametre vermeden çağrıldığında
Hata oluştuğunu anlayalım yeter
Mesaj Kodu :00003
Mesaj Icerik:GENERAL ERROR
——————————————————————-
mesaj ve code, dışardan parametre verilerek çağrılırsa
Hatanın sebebini biliyoruz. Yakaladık
Mesaj Kodu :00002
Mesaj Icerik:Tabloya kayıt eklenirken Hata olustu.
——————————————————————-

Bu örnek daha spesific yapılabilir. Yağ-Salça-Soğan bizden, siz isterseniz içine patates, patlıcan vb… ne katarsanız katın.

Ben en basit şekliyle, sade ve anlaşılır olmasına özen gösteriyorum. sizden yapmanızı istediğim ilk örnek, şudur: success mesaj ve error message type’larının içindeki constructor’larının içinde kod yazmayın. base’e gidip, message’ın nerden geldiğini anlayın ve tüm kodlamayı ordan yapın. (ödev de verirmişiz ya…)

Selam ve Dua ile…

ORACLE PL/SQL – OBJECT TYPE – 3 USING PL/SQL OBJECT TYPE “CONSTRUCTOR”

Her canlının ölümü tadacağını,
ama sadece bazılarının hayatı tadacağını öğrendim. — Mevlana

 

Merhaba

Bir önceki yazımızda, object type ve object type list örneğini inceledik.(Buradan inceleyebilirsiniz)

Artı Bu yazımızda, biraz daha işi profesyonelleştirelim ve  aynı örneği kullanarak, object type’lar içine constructor tanımlaması yapalım mı. Bu yapıyı oracle PL/SQL dilinde ilk duyanlar, hadi yaaa derler genelde. Çünkü bir veritabanından, object oriented çalışma mantığı pek beklemezler. ama ilk object type yazımızda da bunu anlatmaya çalışmıştım(Buradan inceleyebilirsiniz) . ilk iki yazı standart bir tip tanımlaması ve array mantığında, o tipten liste oluşturma şeklinde oldu. artık bu object type’lar içinde çok güzel programlar yazağız.

Muhabbeti uzatmıyor ve sizi kodla baş başa bırakıyorum.

hadi artık objemizi create edelim

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
);
/

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 := 'Calismak Lazim';
    end if;
    
    self.key   := key;
    self.value := value;
    return;
  end;
end;
/

create or replace type t_key_value_list as table of t_key_value;
/

 

Bu kod şunu yapıyor: günleri ve günün numarasını tutup, bunu listelemeye yarıyor. günlerin yüklemesi yapılırken,” tatil mi, çalışma zamanı mı olduğuna karar veriyor.”

Kodu satır satır anlatmaya çalıştm.

Kolay gele.

-- Created on 14.05.2015 by Cevheri 
declare
  v_kv      t_Key_Value; -- oncelikle type degiskenimizi tanımlıyor ve initialize ediyorduk artık yapmıyoruz :)))
  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;
  
    ------------------------
    -- !!!! ÖNEMLİ !!!!!!!!
    -- işte olay burada kopuyor. ilk değer ataması yapılırken, constructor da çalışmasını yapıyor.
    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.
    ------------------------
  
    dbms_output.put_line('Atanan Key         :' || v_kv.key);
    dbms_output.put_line('Atanan Value       :' || v_kv.value);
    dbms_output.put_line('constructor type   :' || v_kv.type);
    dbms_output.put_line('****');
  end loop;

  dbms_output.put_line('-----------------------------');
  -- END WRITE-------------------------------------

  --**************************************************************

  -- READ TYPE-------------------------------------

  v_kv := null;
  dbms_output.put_line('-------  Deger Okuma   ------');
  -- hadi artık, doldurulan listelerin içindeki değerleri okuyalım
  for r in 1 .. v_kv_list.COUNT loop
  
    v_kv := v_kv_list(r); --- yine index vererek okuyoruz....
  
    dbms_output.put_line('Okunan Key         :' || v_kv.key);
    dbms_output.put_line('Okunan Value       :' || v_kv.value);
    dbms_output.put_line('constructor type   :' || v_kv.type);
    dbms_output.put_line('****');
  end loop;

  dbms_output.put_line('----------------------------');
  -- END READ-------------------------------------

end;

 

 

Kodun bendeki çıktısı şu şekilde, bir de siz deneyin bakalım doğru çalışıyor mu …….

------ Deger Atama  ------
Atanan Key         :1
Atanan Value       :PAZARTESI
constructor type   :Calismak Lazim
****
Atanan Key         :2
Atanan Value       :SALI
constructor type   :Calismak Lazim
****
Atanan Key         :3
Atanan Value       :CARSAMBA
constructor type   :Calismak Lazim
****
Atanan Key         :4
Atanan Value       :PERSEMBE
constructor type   :Calismak Lazim
****
Atanan Key         :5
Atanan Value       :CUMA
constructor type   :Calismak Lazim
****
Atanan Key         :6
Atanan Value       :CUMARTESI
constructor type   :Tatil
****
Atanan Key         :7
Atanan Value       :PAZAR
constructor type   :Tatil
****
-----------------------------
-------  Deger Okuma   ------
Okunan Key         :1
Okunan Value       :PAZARTESI
constructor type   :Calismak Lazim
****
Okunan Key         :2
Okunan Value       :SALI
constructor type   :Calismak Lazim
****
Okunan Key         :3
Okunan Value       :CARSAMBA
constructor type   :Calismak Lazim
****
Okunan Key         :4
Okunan Value       :PERSEMBE
constructor type   :Calismak Lazim
****
Okunan Key         :5
Okunan Value       :CUMA
constructor type   :Calismak Lazim
****
Okunan Key         :6
Okunan Value       :CUMARTESI
constructor type   :Tatil
****
Okunan Key         :7
Okunan Value       :PAZAR
constructor type   :Tatil
****
----------------------------

 

 

Selam ve Dua ile

ORACLE PL/SQL – OBJECT TYPE -2 USING PL/SQL OBJECT “TYPE LIST”

Denizi bir testiye dökersen ne alır?

:Bir günün kısmetini –Mevlana

 

Merhaba
Önceki makalemizde object type’ları incelemiştik.(Buradan inceleyebilirsiniz) Bu makalemizde de object type’ların list özelliğini inceleyeceğiz
Herzaman ki gibi önce create. Hadi type ve type listimizi create scriptini yazalım.

---create type
create or replace type t_key_value as object 
(
key    varchar2(1000),
value  varchar2(4000)
)
/

 

-- create type (List<>)

create or replace type t_key_value_list as table of t_key_value;
/

 

type’ı referans alan bir liste oluşturmuş olduk aslında.
Şimdi bunları nasıl kullanacağız onu inceleyelim.
Kısa bir özet geçeyim.
Öncelikle bir for dongusu kuruyoruz. bu dondu 1 den 7ye kadar(7 de dahil) çalışacak.
bu for dongusunda gelen deger 1 ise pazartesi, 2 ise salı, 3 ise çarşamba… olacak şekilde
v_day diye bir değişkenimize değer atıyor. burada farklı olarak case kullanıyoruz(Buradan case kullanımını inceleyebilirsiniz)
buraya kadar fasa fiso….
Burdan sonra artık v_kv type’ımıza değer ataması yapıyoruz(Bu konuyuda buradan inceleyebilirsiniz)

type’ı doldurduktan sonra, v_kv_list’i extend edip, oluşturduğumuz type’ı index vererek atıyoruz.
daha sonra verdiğimiz bu index’ten geri okuyacağız

Burada iki for döngüsü var, biri yazar biri okur.
Her kodun yanına comment eklemeye çalışıyorum ki, sıfırdan başlayan insanlarda anlayabilsin diye
Faydalı olabilmek ümidiyle

 

-- Created on 14.05.2015 by Cevheri 

declare
  v_kv      t_Key_Value := t_Key_Value(null, null); -- oncelikle type degiskenimizi tanımlıyor ve initialize ediyoruz
  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;
    ------------------------
    -- 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.
    ------------------------
  
    dbms_output.put_line('Atanan Key   :' || v_kv.key);
    dbms_output.put_line('Atanan Value :' || v_kv.value);
  end loop;
  
  dbms_output.put_line('-----------------------------');
  -- END WRITE-------------------------------------

  --**************************************************************

  -- READ TYPE-------------------------------------
  
  v_kv := null;
  dbms_output.put_line('-------  Deger Okuma   ------');
  -- hadi artık, doldurulan listelerin içindeki değerleri okuyalım
  for r in v_kv_list.first .. v_kv_list.last loop
  
    v_kv := v_kv_list(r); --- yine index vererek okuyoruz....
  
    dbms_output.put_line('Okunan Key   :' || v_kv.key);
    dbms_output.put_line('Okunan Value :' || v_kv.value);
  end loop;
  
  dbms_output.put_line('----------------------------');
  -- END READ-------------------------------------

end;

Selam ve Dua ile…

DBMS_APPLICATION_INFO – 2 (MODULE , ACTION)

Hiç görmediğim bir sevinçle; kapına geldim.
“Kim o” de yeter ki;
Sen kim olmamı istiyorsan o olmaya geldim –Mevlana

Merhaba

Daha önce dbms_application_info.client_info metodundan hatırlanacağı gibi, oracle session bilgilerini read ve set edebiliyorduk.

(Öncelikle bu yazıyı okumanızda fayda var DBMS_APPLICATION_INFO – 1   (CLIENT_INFO))

Oracle Client_Info haricinde session’ı setleyebileceğimiz iki alan daha veriyor; bunlarda Module_Name ve Action_Name bilgileridir. Bu iki değer için, Module Action bilgisinin parent’i diyebiliriz.

Örnek ile anlatalım,

Oracle ile çalışan bir Program yazdınız. İsmi: OracleIleCalisanProgramSoft. Programınız; oracle’a her connect olduğunuda “Module” alanını programınızın ismiyle setlersiniz. o sabit kalır. Sonra her farklı işlem yapmaya kalktığında da, action kısmını setlersiniz.

Örnek :

Sisteme Giriş Yaparken (loglama vs.. yaptığınızı varsayalım ve uzun sürdüğünü düşünelim.)

Module: OracleIleCalisanProgramSoft

Action  : Login

 

Muhasebe işlemleri yapmaya başladı

Module: OracleIleCalisanProgramSoft

Action  : Muhasebe

 

Raporlama almaya başladı (Topluca Fatura Hazırlıyor vs..)

Module: OracleIleCalisanProgramSoft

Action: Raporlama

 

Bu Sayede, hali hazırda program işlemlerine devam ederken bunu takip edebilecek, tablolara bir kaydın hangi aşamada atıldığını tutmak isterseniz de yine yazılmış bu action bilgisini read ederek kulllanabileceksiniz.

———————————————————————

Artık kod yazmaya devam edebilir (En sevdiğim tarafı)

Bunların nasıl yapılacağını yazalım.

-------
-------
declare
  -- ilk module atamalarımı yapıyorum.
  v_module        varchar2(4000) := 'ORACLE_ILE_CALISAN_HERHANGI_BIR_PROGRAM.EXE';
  v_active_module varchar2(4000) := null;

  -- ilk action atamalarımı yapıyorum.
  -- Bunu programın ilerleyen zamanlarında da değiştirebilir ve tekrar set_action yapabilirim.
  v_action        varchar2(4000) := 'PROGRAMIN_BIR_PARCASI';
  v_active_action varchar2(4000) := null;
begin
  -- Sessiondaki, module ve action bilgilerini okuyalım...
  dbms_application_info.read_module(module_name => v_active_module, action_name => v_active_action);

  -- Module bilgisi daha önce hiç atanmamışsa, atamasını yapıyoruz.
  if (v_active_module is null) then
    dbms_application_info.set_module(v_module, v_action);
    dbms_output.put_line('Sessiona Yeni atanan Module Bilgisi : ' || v_module);
  else
    -- varsa olan bilgiyi kullanabiliriz
    dbms_output.put_line('Sessiondaki Aktif Module Bilgisi : ' || v_active_module);
  end if;

  --Action bilgisi o an için atanmamışsa veya atamasını istediğimiz bilgiden farklıya
  if (v_active_action is null or v_active_action != 'BENIM_ISTEDIGIN_ACTION_BILGISI_DEGILSE') then
    dbms_application_info.set_action(action_name => v_action);
    dbms_output.put_line('Sessiona Yeni atanan Action Bilgisi : ' || v_action);
  else
    --Varsa ve benim istediğim bilgiyse direk okuyabiliriz....
    dbms_output.put_line('Sessiondaki Aktif Module Bilgisi : ' || v_active_action);
  end if;
end;
/
----------

dbms_application_info.set_module,

dbms_application_info.set_action,

dbms_application_info.read_module metodlarını inceledik.

Kolay gelsin dileklerimle…

 

Selam ve Dua İle…

 

DBMS_APPLICATION_INFO – 1 (CLIENT_INFO)

Ayağın kırıldı diye üzülme.
Allah sana belki kanat verecek.

Kuyu dibinde kaldın diye kırılma,
belki oradan bile bir kapı açılır.

Yusuf kuyudan sultan oldu –Mevlana

Merhaba

Bugünkü yazımız, PL/SQL Developer’ların sıklıkla kullandığı

DBMS_APPLICATION_INFO.READ_CLIENT_INFO  ve DBMS_APPLICATION_INFO.SET_CLIENT_INFO procedurleriyle alakalı olacaktır.

Öncelikle Client_Info nedir ondan bahsedelim.

select v.CLIENT_INFO, v.* from v$session v

Oracle, sistemdeki aktif sessionların bilgisini yukardaki bir view aracılığıyla bize sunmaktadır. sisteminizdeki aktif sessionların listesini bu sorgu ile görebilirsiniz. Her yeni session açıldığında, bu sessiona ait bir yığın bilgi de tutulur. sessionid leri, çalıştırdığı sqller, aktif-pasif durumu, bağlandığı bilgisiyarın bilgileri vb….

Bize de bu bilgilerden bazılarını yazma ve sonrasında okuma imkanı vermiştir. Yani siz oracle’da yeni bir session açtığınızda; oracle’ın bu topladığı veriler haricinde (sınırlı sayıda) session bilgisini kendiniz yönetebilirsiniz.

(Normalde bu işler için GLOBAL TEMPORARY TABLE kullanmak daha doğrudur; ama hazır elimizde olan alanı yönetmek daha kolay olduğu için bu alanlarıda kullanmakta da fayda var. GLOBAL TEMPORARY TABLE hakkında da bir yazı yazmak nasip olursa, orada bu konuyu daha detaylı anlatırım. )

Şimdi set ve read metodlarının örnek kullanımını inceleyelim.

--
declare
  -- atamasını yapacağımız user bilgisini set ediyoruz
  v_client_info        varchar2(4000) := 'TEST_USER'; 

  -- daha önce ataması yapılan user bilgisi varsa bu değişkene atayacağız
  v_active_client_info varchar2(4000) := null; 
begin
  
  -- read metodu ile client info bilgisini değişkene atıyoruz
  dbms_application_info.read_client_info(client_info => v_active_client_info);
  
  -- eğer daha önce atama yapılmamışsa, atama yapacağız; varsa direk yazdıracağız
  if (v_active_client_info is null) then
    dbms_application_info.set_client_info(client_info => v_client_info);
    dbms_output.put_line('Sessiona atanan User Bilgisi : '||v_client_info);
  else
    dbms_output.put_line('Sessiondaki Aktif User : '||v_active_client_info);
  end if;
end;
--

kod ilk çalıştığında çıktı şu şekilde := Sessiona atanan User Bilgisi : TEST_USER

eğer aynı sessionda tekrar çalıştırırsak :=  Sessiondaki Aktif User : TEST_USER

 

Bunu ister database’in logon_triggger’ında isterseniz; yazdığınız arayüzün open session metodunda yazın ve session açık olduğu sürece, istediğiniz yerden bu bilgilere ulaşın.

HAZIR BİR GLOBAL DEĞİŞKEN

Kolay Gelsin Dileklerimle

 

Selam ve Dua ile…

 

Sehirler Arası Mesafe Tablosu

Merhaba

Bugün bir arkadaşımın ödevi için hazırladığım Şehirler arası mesafe tablosunu burda paylaşmak istedim.  İhtiyaç duyan olursa tekrar uğraşmasın

 

create scripti

create table ILMESAFESI
(
  id     NUMBER,
  ilid1  NUMBER,
  ilid2  NUMBER,
  mesafe NUMBER
);

 

örnek insert scripti

insert into ILMESAFESI (id, ilid1, ilid2, mesafe)
values (1, 2, 1, 330);

 

sql scriptinin tamamını dosya olarak ekliyorum. ilmesafesi

PL/SQL Pivot Sorgu (Pivot Table Ozelligi)

Merhaba,

Bugünkü yazımızda sql ile pivot sorgu özelliğini yapacağız. Eminim çok seveceksiniz. Excel’den alışkın olanlar bilirler. Çok harika bir özelliktir.

Biz firmaların illere göre dağılımını ele alacağız örnek çıktı şu şekilde olacak

FIRMAADI Konya Ankara İstanbul
Analiz Firması 0 1 0
Bakım 0 0 1
Global 0 0 1
Proje Firması 1 0 0
Satış Firması 0 0 1
Test Firması 0 0 1
Yazılım Firması 0 1 0

Sorgumuz da aşağıdaki gibi olacaktır.

select *
  from (select f.firmaadi, i.adi
          from firma f, ililce i
         where f.ilid = i.plakakodu
           and i.ilcekodu = 0) 
 pivot(count(*) for adi in('Konya', 'Ankara', 'İstanbul'))
 order by firmaadi;

İşte bu kadar basit. Artık bir istatistik verirken daha rahat edeceksiniz.

 

 

number to_tıme() metodu hazırlama

 

Çok defa başıma gelmiş ancak her seferinde farklı kodlarla çözdüğüm bu işi 
metoda dökmek istedim.

Elimizde bir numara var ve biz bunu saniye cinsinden; time formatında bir değere
kolay bir şekilde çevirmek istiyoruz. 
Öncelikle IN parameter olarak numara alan ve geriye tarih ve saat döndüren 
bir metod yazalım ve bunun çağrılışına bir örnek verelim.&nbsp;


create or replace Function NumberToTime(p_number in Number) return date is
  v_time   varchar2(8) := '00:00:00'; -- ilk değer atamalarımızı yapalım...
  v_Result date := to_date(trunc(sysdate) ||' '||  v_time, 'dd.mm.yyyy hh24:mi:ss');
begin
  -- gelen parametre dolu ise kodumuz çalışmalı
  -- sıfırdan büyük rakamlar için çalışmalı
  if p_number is not null and p_number > 0  then
    select to_char(trunc(p_number / 3600), 'FM9900') || ':' || 
           to_char(trunc(mod(p_number, 3600) / 60), 'FM00') || ':' ||
           to_char(mod(p_number, 60), 'FM00')
      into v_time
      from dual;
  end if;

  v_Result := to_date(trunc(sysdate) ||' '|| v_time, 'dd.mm.yyyy hh24:mi:ss');
  Return(v_Result);
Exception
  When Others Then
    -- herhangi bir hata olursa, 
    -- sysdate dönecektir.
    Return(v_Result);
end NumberToTime;


------------------------------------
-- call
select NumberToTime(121) from dual;
20.09.2014 00:02:01

------------------------------------

Metodumuza 121 diye bir rakam gönderdim; geriye 2 dakika 1 saniye olarak dönmüş oldu.
Bu şekilde bir numaranın, nasıl date time'a çevrildiğini öğrenmiş olduk.