SYS_REFCURSOR İçeriğine Erişmek
Bu yazıda Oracle da prosedür içerisinden SYS_REFCURSOR doldurup bu CURSOR içerisindeki her satıra tek tek erişerek ekrana basma işlemi yapacağız.
Bir tablodaki kayıt ile ilişkili başka bir tabloda birden fazla kayıt bulunabilir (1 - n ilişki) ve siz alt tabloda üst tablonun id si olan kayıtları göstermek isteyebilirsiniz
Tablolar arasındaki ilişki gözüküyor.
Prosedurümüz üst kısmında gerekli tanımlamaları yapıyoruz.
RC_CURSOR SYS_REFCURSOR; --cursor tanımlaması
TALEP_ID NUMBER; --silinecek üst id
TALEP_BIRIM_ID NUMBER; -- cursordan gelen her bir değerin atılacağı değişken (temp gibi)
TALEP_ID:=1;
CURSOR açıyoruz ve içeriğini dolduruyoruz .
Cursor doldurma işlemi klasik bir select cümleciğiyle yapılabilir.
Dışarıdan gelen parametreleri de bu cümlecik içerisinde kullanabilirsiniz.
OPEN RC_CURSOR
FOR SELECT NTALEP_BIRIM_ID
FROM ITS_HRK_TALEP_BIRIM
WHERE NTALEP_ID = TALEP_ID ;
Listeleyeceğimiz dataları cursor içerisine aldıktan sonra bir döngü yardımıyla cursor içerisindeki değerlere tek tek erişeceğiz.
Buradaki döngü programlama dillerinde var olan dongülerle aynı mantık içerisinde çalışmaktadır.
Düngü LOOP ile başlar ve END LOOP ile biter.
FETCH ifadesiyle cursor içerisindeki ilk değeri temp değişkenimiz olan TALEP_BIRIM_ID içerisine atıyoruz.
Burada bizim döngüden çıkmamızı sağlayacak ifade ise RC_CURSOR%NOTFOUND ifadesidir.
Bu ifade TRUE döndüğü anda CURSOR içerisinde eleman kalmamış demektir ve döngüden çıkılır.
DBMS_OUTPUT.PUT_LINE(TALEP_
DBMS_OUTPUT.PUT_LINE sadece bir örnek bu kısımda CURSOR içerisinde sakladığınız verilerle her türlü işlem yapabilirsiniz.
Silme, güncelleme, ekleme gibi. Son kısımda ise CURSOR kapatılıyor. Bu işlemi bizim için şart değil eğer siz kapatmazsanız oracle bu işlemi gerçekleştirecektir.
LOOP
FETCH
RC_CURSOR INTO TALEP_BIRIM_ID;
EXIT WHEN RC_CURSOR%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(TALEP_
END LOOP;
CLOSE RC_CURSOR;
END;
Kodumuzun çalışan şekli.
------------------------------
DECLARE
RC_CURSOR SYS_REFCURSOR;
TALEP_ID NUMBER;
TALEP_BIRIM_ID NUMBER;
BEGIN
TALEP_ID:=52;
OPEN RC_CURSOR FOR
SELECT NTALEP_BIRIM_ID FROM ITS_HRK_TALEP_BIRIM WHERE NTALEP_ID = TALEP_ID ;
LOOP
FETCH
RC_CURSOR INTO TALEP_BIRIM_ID;
EXIT WHEN RC_CURSOR%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(TALEP_
END LOOP;
CLOSE RC_CURSOR;
END;
------------------------------
Bu tablolar sizde olmadığı için CURSOR 'ı DUAL dan select yaparak doldurabilirsiniz.
Son olarak RC_CURSOR ifadesinde kullanabileceğiniz diğer parametreler
cursor%ROWCOUNT - int - CURSOR içerisindeki kayıt sayısı
cursor%ROWTYPE - CURSOR içerisindeki alanların tipi
cursor%FOUND - bool - TRUE CUROSR içerisinden veri dönerse
cursor%ISOPEN - bool - TRUE CURSOR açıksa
Add Months() Fonksiyonu
ADD_MONTHS Fonksiyonu ve Gün Ekleme
Merhaba arkadaşlar, Bu makalemde add_months() fonksiyonundaki bir takım incelikleri sizlerle paylaşacağım. Tarih bilgisi içeren önemli ve kritik raporlarınızda kesinlikle dikkatinizden kaçmaması gereken bir konu olduğunu düşünüyorum.
SQL tarih fonksiyonlarından biri de add_months fonksiyonudur. Bu fonksiyonun çeşitli kullanım şekilleri vardır. Fakat fonksiyonun temel mantığı; girilen bir tarihten itibaren, verilen ay sayısı kadar geriye veya ileriye gitmektir. Fonksiyonu analiz edersek ;
add_months(‘date’,number) şeklinde;
-date à girdiğimiz bir tarih,
-number à herhangi bir sayı (3,8,-4 gibi)
Şimdi fonksiyonu birkaç örnekle inceleyelim :
|
İfade |
Sonuç |
1 |
ADD_MONTHS('10-APR-2010', 2) |
10/06/2010 |
2 |
ADD_MONTHS(SYSDATE,2) |
07/02/2011 14:00:15 --(çalıştırdığım tarih üzere) |
3 |
ADD_MONTHS('15-JUL-1988',-2) |
15/05/1988 |
4 |
ADD_MONTHS('31-JAN-2010', 1) |
28/02/2010 |
5 |
ADD_MONTHS('30-JAN-2010', 1) |
28/02/2010 |
6 |
ADD_MONTHS('29-JAN-2010', 1) |
28/02/2010 |
7 |
ADD_MONTHS('28-JAN-2010', 1) |
28/02/2010 |
8 |
ADD_MONTHS('27-JAN-2010', 1) |
27/02/2010 |
9 |
ADD_MONTHS('30-JUN-1988',1) |
31/07/1988 |
10 |
TO_DATE('31-JAN-2010') + 30 |
02/03/2010 |
Yukarıdaki tablonun her satırındaki örnekleri dikkatle incelemekte fayda var.
Tablodaki örneklerden ilkinde ; 10 nisan 2010 tarihine , 2 ay ekliyoruz ve sonuç olarak 10 haziran tarihine gidiyoruz. Aynı şekilde 3. Örnekte 15 temmuzdan 2 ay geriye giderek 15 mayıs tarihine geliyoruz fakat dikkat etmemiz gereken önemli bir nokta var : O da 4 ve sonraki satırlardaki örnekler.
4. Örnekte, 31 ocak tarihine bir ay eklediğimizde 28 Şubata gidiyor. Yani bu fonksiyon mantık olarak seçilen tarih üzerine 30 gün eklemiyor. Takvim üzerinde direk belirtilen günden “x ay sonrasına” gidiyor. 4,5,6 ve 7. Satırlardaki ifadelerin aynı sonucu döndürmesinin sebebi budur. 30 ocaktan 1 ay sonra da 28 şubattır; 28 ocaktan 1 ay sonra da 28 şubattır. Burada dikkat edilmesi gereken, ay ekleme işlemini gün bazında değil takvim bazında yapmasıdır.
10. örneğe baktığımızda ise ekleme işlemi tamamen gün bazında yapılmaktadır. Yani verilen tarihin üstüne takvim üzerinden x sayıda gün eklenir ve o sonuç döndürülür.
İnvalid Durumdaki Objeleri Bulma
Hepimizin karşılaştığı güncel sorunlardan bir taneside yazdığımız view’ların,fonsiyonların,prosedürlerin..vb invalid olması durumu.İnvalid durumdaki objeleri şema browserdan bakabilir,neden invalid olduğunu araştırabilir ve düzenleyebiliriz.Ama hepsini bulmak biraz zaman alabilir.O yüzden bütün bunları bir arada görebileceğimiz kodumuzu görelim
Yapı Kredi Bankası DataWarehouse Uygulaması
"YKB Oracle 8i üzerinde geliştirdiği DataWarehouse uygulamasını yedi hafta içerisinde Sybase IQ ya taşıyarak, on aylık geri ödeme süresi ile yatırım geri dönüş maliyetinde %154 kazanç sağlamış oldu. Türkiye' nin ilk özel bankası olan Yapı Kredi Bankası, 500 şubeye sahip olmakla beraber ve leasing, faktoring, sigorta, Yatırım Bankacılığı gibi çeşitli finans kurumlarında uluslararası iştiraki olan bir bankadır. Aynı zamanda kredi kartları iş hacminde de lider bir banka konumundadır. Bu kredibiliteyi, büyümeyi ve müşteri memnuniyetini sürsürebilmek için bilgi teknolojilerine yatırım yapan lider kurumlardan biridir.
Mevcut datawarehouse larında 25 farklı operasyonel sistemden gelen bir terabyte tan fazla veri mevcut bulunmaktaydı. Önceden tanımlı ve ayarlanmış sorguların sonuçları 24 saatten uzun süren bir süre zarfında alınmakta idi. Data setlerinin büyüklüğü sorgulama işlemini hem güçleştiriyor hem de zaman kaybına yol açıyordu. Ad-hoc sorgular hemen hemen imkansız hale gelmekte idi. YKB bu sistemi performansı artırarak, düşük maliyetler çerçevesinde ihtiyaçlarını karşılamak üzere değiştirmeye karar verdi. Çözüm alternatiflerini değerlendirirken, üç farklı vendor ı üç günlük analiz ve Proof-of-concept çalışması yapmak üzere davet etti. Hedefleri, 8 hafta içerisinde production ortamına geçiş yapmak üzere, en hızlı ve doğru bir şekilde migration planını çıkarabilmek olmuştu. Sorgulama da hızlanma, veri depolamada en düşük kaynaka ve performans önem verdikleri kriterler arasında yer almakta idi. Ve sonuç olarak YKB, Sybase IQ ürününü seçti. YKB uygulama grubu ile iki Sybase danışmanı tarafından oluşturulan bir proje grubu sayesinde, yeni sistem yedi hafta içerisinde hayata geçirildi. Yeni oluşturulan datawarehouse uygulaması, kolon tabanlı çalışma metodolojisine dayalı olup, yüksek bir performans göstermeyi başardı. Sorgu cevap sürelerinde mükemmelliğe erişildi: Sorguların %88.4 bir saniye yada daha az sürede gerçekeşmektedir, %7 si 1-10 saniye içerisinde, %1.7 si 10-30 saniye arasında gerçekleşmektedir.
Ayrıca, yeni kurulan sistem tamamı ile SQL uyumlu olduğu için, veritabanı yönetcilerinin kısa sürede bu sisteme hakim olması oldukça kolay olmuştur. YKB eskiden bir terabyte yer tutan verilerini, artık Sybase IQ üzerinde 350 gigabyte lar seviyesine indirmiştir. 12 CPU lu sistem yerine 3 CPU lu bir sistem üzerinde DW uygulamalarını çalıştırmaktadırlar. YKB bünyesinde satış, pazarlama ve kredi kartları çalışanları kolay ve hızlı bir şekilde yeni sisteme olaşabilmekte ve kompleks ad-hoc sorgular çalıştırabilmektedirler."
UNION ALL Kullanımı
Oracle da birkaç tablo üzerinde birlestirme ya da fark alma islemleri yapilabilir. Bunun için UNION, INTERSECTION ve MINUS operatörleri kullanilir. Asagidaki örneklerde UNION operatörü ile birlestirilmistir sonuçlari görecegiz.
SELECT JOB_ID
FROM EMPLOYEE
WHERE DEPARTMENT_ID = 10
UNION ALL
SELECT JOB_ID
FROM EMPLOYEE
WHERE DEPARTMENT_ID = 20
Sorgu çalistiginda çikan sonucumuz
JOB
----------
MGR
TECH
HR
MGR
HR
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=6 Card=4 Bytes=40)
1 0 UNION-ALL
2 1 TABLE ACCESS (FULL) OF 'EMPLOYEE' (TABLE) (Cost=3 Card=2
Bytes=20)
3 1 TABLE ACCESS (FULL) OF 'EMPLOYEE' (TABLE) (Cost=3 Card=2
Bytes=20)
SELECT JOB_ID
FROM EMPLOYEE
WHERE DEPARTMENT_ID = 10
UNION
SELECT JOB_ID
FROM EMPLOYEE
WHERE DEPARTMENT_ID = 20
JOB
----------
HR
MGR
TECH
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=8 Card=4 Bytes=40)
1 0 SORT (UNIQUE) (Cost=8 Card=4 Bytes=40)
2 1 UNION-ALL
3 2 TABLE ACCESS (FULL) OF 'EMPLOYEE' (TABLE) (Cost=3 Card
=2 Bytes=20)
4 2 TABLE ACCESS (FULL) OF 'EMPLOYEE' (TABLE) (Cost=3 Card
=2 Bytes=20)
SELECT DEPARTMENT_ID, JOB_ID
FROM EMPLOYEE
WHERE DEPARTMENT_ID = 10
UNION ALL
SELECT DEPARTMENT_ID, JOB_ID
FROM EMPLOYEE
WHERE DEPARTMENT_ID = 20
ORDER BY 1
DEP JOB_ID
---------- ----------
10 TECH
10 MGR
20 MGR
20 HR
20 HR
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=7 Card=4 Bytes=40)
1 0 SORT (ORDER BY) (Cost=6 Card=4 Bytes=40)
2 1 UNION-ALL
3 2 TABLE ACCESS (FULL) OF 'EMPLOYEE' (TABLE) (Cost=3 Card
=2 Bytes=20)
4 2 TABLE ACCESS (FULL) OF 'EMPLOYEE' (TABLE) (Cost=3 Card
=2 Bytes=20)