SQL sorgusu ile oran (dağılım) bulmak

PaylaşTweet about this on TwitterShare on FacebookEmail this to someoneShare on Google+Share on LinkedInShare on TumblrShare on RedditPin on PinterestDigg thisFlattr the authorShare on StumbleUponBuffer this page

Ratio_to_report elimizdeki veriler arasında bulunan oran'ı hesaplamak için kullanabileceğimiz fonksiyondur.

 

 

SELECT last_name, salary, round((RATIO_TO_REPORT(salary) OVER ()) * 100, 2) AS rr

   FROM hr.employees

   WHERE job_id = 'PU_CLERK';

 

yukarıda bulunan sql in sonucu;

 

Ratio_to_report fonksiyonu içerisine yazdığımız sütun üzerinden hesaplama yapılmasını ve her bir satırın toplamın yüzde kaçına denk geldiğini buluruz. Yani toplam salary üzerinden her bir kaydın bu toplamın % kaçı olduğunu hesaplamak için bu fonksiyonu kullanıyoruz. Round komutunu sonucu 2 hane olarak görmek için kullandım, uygulamanızın durumuna göre hassasiyeti ayarlayabilirsiniz.

 

PaylaşTweet about this on TwitterShare on FacebookEmail this to someoneShare on Google+Share on LinkedInShare on TumblrShare on RedditPin on PinterestDigg thisFlattr the authorShare on StumbleUponBuffer this page

Fonksiyonlar

PaylaşTweet about this on TwitterShare on FacebookEmail this to someoneShare on Google+Share on LinkedInShare on TumblrShare on RedditPin on PinterestDigg thisFlattr the authorShare on StumbleUponBuffer this page

Uzun bir aradan sonra birkaç fonksiyondan bahsediyim 🙂

 

 

 

ABS: Mutlak değer fonksiyonu.

 

SELECT 10, ABS (-10), 12, ABS (12)

  FROM DUAL


 

 

CEIL: Değeri kendisine eşit veya kendisinden büyük en küçük tam sayı değerine çevirir.

 

FLOOR: Değeri kendisine eşit veya kendisinden küçük en büyük tam sayı değerine çevirir.

 

SELECT 18.9, CEIL (18.9), FLOOR (18.9), 22, CEIL (22), FLOOR (22)

  FROM DUAL

 

 

EXP: Matematiksel sabit olan e (2,71828…) nin üslü ifadesini bulmak için kullanılır.

 

SELECT EXP (1), EXP (2)

  FROM DUAL;

 

MOD: X sayısının Y sayısına bülümünden kalanı verir. X sıfır ise Y değerini döndürür. X değeri negatif olduğu zaman mod fonksiyonu matematikte kullanılan mod işleminden farklı sonuç döndüreceği unutulmamalıdır. Matematikte kullanılan mod işlemi şu şekilde hesaplanıyor; X – Y * FLOOR(X/Y)

SELECT MOD (13, 5), MOD (-13, 5), MOD (13, 5), MOD (-13, 5)

  FROM DUAL;

 

 

Aynı değerlere klasik matematik fonksiyonu ile bakalım;

 

SELECT (13) (5) * FLOOR ((13) / (5)) "MOD (13, 5)",

       (-13) (5) * FLOOR ((-13) / (5)) "MOD (-13, 5)",

       (13) (-5) * FLOOR ((13) / (-5)) "MOD (13, -5)",

       (-13) (-5) * FLOOR ((-13) / (-5)) "MOD (-13, -5)"

  FROM DUAL

 

POWER: Üslü ifade fonksiyonudur. Kullanımda dikkat edilmesi gereken power(x,y) şeklinde bir kullanımda eğer x negatif bir sayı ise y integer bir değer almalıdır.

 

SELECT POWER (3, 2), POWER (3, 2), POWER (-3, 2)

     , POWER (3.2, 2), POWER (3.2, 2.2), POWER (-3.2, 2)

     , POWER (-3.2, 2)

FROM   DUAL;

 

 

SELECT POWER (-3, 2.2)

  FROM DUAL;

 

Bu şekilde sorguladığımızda sonuç ne olur? (Eğer x negatif bir sayı ise y integer bir değer almalıdır)

 

 

SIGN: Sign fonksiyonu alacağı değere göre -1, 0, 1 değerlerinden birisini döndürür. Eğer parametremiz 0 dan küçükse -1, 0 a eşitse 0, 0 dan büyükse +1 değerini elde ederiz. BINARY_FLOAT ve BINARY_DOUBLE değişkenler için ufak bir fark vardır. Parametre 0 dan küçükse -1, 0 dan büyük veya 0 a eşitse +1 değerini elde ederiz.

 

SELECT SIGN(-2), SIGN(0), SIGN(9),

       SIGN(-2.07f),SIGN(0f),SIGN(2.07f)

  FROM DUAL

 

 

WIDTH_BUCKET: Kayıtlarımızı aralıklara bölerek hangi kaydın hangi aralığa düştüğünü bulabilmemizi sağlar. Yani equiwidth histogram oluşturuyoruz.


 

SELECT last_name,

       salary,

       WIDTH_BUCKET (salary,

                     2500,

                     3000,

                     3) WIDTH_BUCKET

  FROM hr.employees

 WHERE EMPLOYEES.job_id = 'PU_CLERK'

 order by 3



 

PaylaşTweet about this on TwitterShare on FacebookEmail this to someoneShare on Google+Share on LinkedInShare on TumblrShare on RedditPin on PinterestDigg thisFlattr the authorShare on StumbleUponBuffer this page

Set transaction read-only komutu

PaylaşTweet about this on TwitterShare on FacebookEmail this to someoneShare on Google+Share on LinkedInShare on TumblrShare on RedditPin on PinterestDigg thisFlattr the authorShare on StumbleUponBuffer this page

Set transaction komutunu read-only transaction başlatmak için kullanabiliriz. Başka bir kullanıcı sizin o an eriştiğiniz tabloda bir update yaparken sizin transactionunuz bundan etkilenmeden işleyişine, verinin önceki (sizin transactionunuzun başladığı andaki hali) halini kullarak, devam edecektir. 

Bu şekilde bir transaction kullanmak istediğinizde set transaction read-only komutu ilk sql statement'iniz olmalıdır ve başlattığınız transaction ilk commit/rollback komutuyla son bulacaktır.

Declare

..

Begin

commit; –önceki transaction'u bitiriyoruz.

Set Transation Read-Only; — Read-only transaction'umuz başlıyor.

.

(select…)

.

commit;– Read-only transaction'umuz burada son buluyor.

End;

Read-Only; Transaction-level read consistency'yi sağlar. Set transaction read only komutu ile başlattığınız transaction içerisinde yapacağınız işlemler hep aynı database snapshot'ı üzerinde olacağı için diğer kullanıcıların query/update işlemlerinden etkilenmezsiniz. 

Read only transaction içerisinde kullanabileceğiniz komutlar ise sınırlıdır. Kullanabileceğiniz komutlar; Select into, open, fetch, close, lock table, commit komutlarıdır.

Bu komut SYS kullanıcısı için işlevsizdir, SYS kullanıcısı transaction'u read-only başlatsa bile diğer kullanıcıların değişikliklerinden etkilenecektir.

PaylaşTweet about this on TwitterShare on FacebookEmail this to someoneShare on Google+Share on LinkedInShare on TumblrShare on RedditPin on PinterestDigg thisFlattr the authorShare on StumbleUponBuffer this page

Autonomous Transaction

PaylaşTweet about this on TwitterShare on FacebookEmail this to someoneShare on Google+Share on LinkedInShare on TumblrShare on RedditPin on PinterestDigg thisFlattr the authorShare on StumbleUponBuffer this page

Autonomous transactionlar başka bir transaction tarafindan başlatılan ve kendisini çağıran(başlatan) transactiondan (main transaction) tamamen bağımsız çalışan transactionlardır. Örneğin bir transaction içerisinde işlemin sonucuna bakılmaksızın log oluşturmak istiyor olalım, log tablomuz işlem başarılıysa zaman,kullanıcı gibi bilgileri, başarısız olursa zaman ve kullanıcı ile beraber alınan hata bilgisini tutuyor olsun. Transaction içerisinde işlem başarılıysa commit edeceğimiz için sorun yok log tablomuza da insert yapıp commit ile kaydederiz. Peki transaction içersinde hata aldık ve rollback yapmak istersek ne olacak? İşte burada ana transactionumuzdan bağımsız çalışan ve log tablomuza her şartta kayıt yazan bir alt programa ihtiyacımız olacak ve bu transaction ana transaction sonucu ne olursa olsun log tablomuza yazdığı kaydı commit edecek.

Şimdi biraz autonomous transactionların özelliklerine bakalım sonrada syntax'ını görelim.

  • AT lar top-level anonymous block için kullanılabilir. Yani nested-block'ları autonomous olarak tanımlayamazsınız.
  • Standalone veya packaged procedure ve functionları AT olarak tanımlayabilirsiniz.
  • Database triggerleri AT olarak tanımlanabilir.

Bütün bir packageyi AT olarak tanımlayamazsınız ama package içerisindeki bütün function ve procedureleri ayrı ayrı AT olarak tanımlayabilirsiniz.

AT triggerlar ile normal triggerler arasındaki fark ise AT içerisinde COMMIT, ROLLBACK yapılabiliyor olması ayrıca EXECUTE IMMEDIATE ile yazıldığında CREATE DROP gibi DDL statementleri de AT triggerler içerisinde kullanılabilir.

AT kullanılırken çok dikkat etmek gerektiğini düşündüğüm bir nokta; MT içerisinde SAVEPOINT kullanıyorsanız ve SAVEPOINT noktanız AT yi başlattığınız noktadan önceyse ve siz AT bittikten sonra MT içerisinde SAVEPOINT noktasına dönmek isterseiz AT içerisinde yapılan işlem rollback edilmez. Bunun sebebi AT nin tamamen MT den bağımsız çalışan bir transaction olmasıdır. Bağımsız çalışan bir transaction olduğu için de main transaction ile lock, commit-dependency vs. paylaşmaz.

Bu bağımsız çalışma ilkesinin birtakım sakıncaları var,AT yi bunlara dikkat ederek kullanmak gerekir. Eğer AT içerisinde MT tarafından lock edilmiş bir kayıt ile işlem yapmak isterseniz deadlock oluşur ve AT içerisinde hata alırsınız. Bu hatayı handle etmemişseniz AT rollback edilecektir. Aynı şekilde AT yi commit veya rollback etmeden çıkmak isterseniz veya handle edilmemiş herhangi bir hata ile karşılaşılırsa AT otomatik olarak rollback edilir.

AT içerisinde yaptığınız bir commit diğer transactionlar tarafından görünmeye başlar. Eğer main transaction'un isolation level'ini READ COMMITTED yapmışsanız(default olarak böyledir) MT (main transaction) içerisinde de bu değişiklikleri görebilirsiniz ancak isolation level'i SERIALIZABLE olan MT AT nin sonucunu göremez.

Syntax ise oldukça basit.

Kullanacağımız program unit'in declare section'unda

PRAGMA AUTONOMOUS_TRANSACTION;

tanımını yapmamız yeterli. Bu ifadeyi declare sectionunda istediğimiz yere yazabiliriz ancak
okunurluğu artırmak ve unit'imizin AT olduğunun daha kolay anlaşılabilmesi için Declare sectionun ilk
satırında yazmamız önerilmektedir.
Daha öncede yazdığım gibi AT yi sonlandırmak için commit veya rollback yapmamız gerek yoksa hata alırız.

Basit bir örnekle kullanımını görelim.

 

CREATE TABLE AT_TEST (id         number, explanation varchar2 (15))

 

CREATE PROCEDURE AT_INSERT
IS
   PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
   INSERT INTO at_test (id, explanation)
     VALUES   (3, 'Auto Trans');

   INSERT INTO at_test (id, explanation)
     VALUES   (4, 'Auto Trans');

   COMMIT;
END;
/

 

BEGIN
   INSERT INTO at_test (id, explanation)
     VALUES   (1, 'Main Trans');

   INSERT INTO at_test (id, explanation)
     VALUES   (2, 'Main Trans');

   AT_INSERT;
   ROLLBACK;

END;
/

 

Kısaca bir test tablosu yarattık. AT_INSERT proceduresi tanımındanda anlayacağınız gibi bir Autonomous transaction. Deneme yaparken ise AT_TEST tablosuna iki kayıt insert edip bu kayıtları select ediyoruz. Daha sonra AT proceduremizi çağırıp 3,4 id li kayıtlarımızı tabloya insert edip commit ediyoruz. Daha sonra MT içerisinde ROLLBACK yapalım bakalım ne olacak sonucu görelim.

Main transaction içerisinde yaptığımız insertler yaptığımız rollback ile geri alındı ancak AT içerisinde yaptığımız işlem geri alınmadı. Bu bağımsız çalıştıklarını tekrar kanıtlamış olduk. Faydalı olur inşallah.

PaylaşTweet about this on TwitterShare on FacebookEmail this to someoneShare on Google+Share on LinkedInShare on TumblrShare on RedditPin on PinterestDigg thisFlattr the authorShare on StumbleUponBuffer this page