Oracle PLSQL Pipeline Nedir ? Pipelined Fonksiyonu Nasıl Tanımlanır ?

Oracle PLSQL Pipeline Nedir ?

Merhabalar, bu yazımda Oracle Pipeline Fonksiyonu nedir sorusunun cevabını vereceğiz.

PLSQL PIPELINED FONKSİYONU yapısı hakkında kısa bir bilgiden sonra bir örnek uygulama ile bu konuyu öğrenmiş olacağımızı umuyorum.

 

Oracle Pipeline Function yapısı nedir :

Pipeline Fonksiyonları yanısıra, Table fonksiyonları, tabloları taklit eden PL / SQL koleksiyonlarını döndürmek için kullanılır. FROM yan tümcesinde TABLE operatörünü kullanarak düzenli bir tablo döndüren PL /SQL fonksiyonu gibi kullanabiliyoruz.

Örnek :

select * from TABLE(xxx_pipelined_or_table_function(parametre1,parametre2));

Oracle Pipeline Function yapısı ve Table Function yapısı bu işe yarar. Biz burada tabi ki performansı daha iyi olan Oracle Pipeline Function yapısını anlatıyor olacağız.

Table Function , veriler tablo şeklinde bize dönmeden önce dönen koleksiyonun tam olarak doldurulmasını gerektirir. Ancak Pipelined Function yapısı bir satır veriyi oluşturmadan diğer satırları da aynı zamanda oluşturmaya devam eder ve bize bir koleksiyon dönmez. Bu sebeple daha hızlıdırlar .

Peki ben neden bu fonksiyona ihtiyaç duydum veya siz neden buraya kadar gelip bu makaleyi okuma gereği duyuyorsunuz ?

Çok büyük bir ihtimal ile benimki gibi 7500 küsür satırlık bir sorgu çalıştırmak zorundasınızdır 🙂 Böyle uzun bir sorguyu çalıştırırken ORA-04030 PGA_AGGREGATE_LIMIT hatası alıyorduk, bir önceki yazımda bundan bahsettim. Ardından bu 7500 satırlık sorguyu ne Excel’e ne de başka bir yere programlayıp alamıyoruz. Yani rapor hazır ancak herhangi bir yerden çekme şansımız olmuyor. Çünkü çekmemiz gereken sorgu 7500 satır ve hiç bir yere sığmıyor… İşte Pipelined Function yapısı sayesinde sorgumuz aşağıdaki gibi fonksiyon çağırır şekilde çağrılabiliyor.

select * from TABLE(xxx_pipelined_function(parametre1,parametre2));

 

Pipelined Functonun faydası bu kadarla bitmiyor. 12-15 dakika arasında dönen sorgu sonucu bir defa compile edildikten sonra bir daha ki çalıştırmalarda çok daha hızlı dönüyor.Mesela bu zaman maliyeti benim örneğimde 50 saniyeye kadar düştü 🙂

Örnek:

TYPE gelir_gider_tab_row is record(  -- bize dönecek olan tablonun colonlarını record tipinde tanımlıyoruz.
proje_adi varchar2(100),
aciklama varchar2(120),
OCAK number ,
SUBAT number,
MART number,
NISAN number,
MAYIS number,
HAZIRAN number,
TEMMUZ number,
AGUSTOS number,
EYLUL number,
EKIM number,
KASIM number,
ARALIK number,
TOPLAM_DEVIR_KDV_DAHIL number ,
KUMULE number,
KUMULE_KDV number,
GENEL_TOPLAM number,
PROJE_TOPLAMI number
);
type gelir_gider_tab is table of gelir_gider_tab_row;  -- tanımladığımız recorddan bir tablo tipi oluşturuyoruz.
FUNCTION get_gelir_gider_tab(yil_ in varchar2,tarihbas_ in varchar2,tarihson_ in varchar2) 
RETURN gelir_gider_tab PIPELINED;

Tanımladığımız fonksiyonun Pipelined bir fonksiyon olduğunu “PIPELINED” terimi ile belirtiyoruz. RETURN olarak record’dan oluşturduğumuz tabloyu döndürüyoruz. Yukarıda belirttiğimiz tanım yalnızca paket tanımlamasında belirtmek durumunda olduğumuz tanımdır. Herhangi bir paketin içerisine bunu tanımlamalıyız. Devamında aynı paketin paket gövdesinde aşağıdaki gibi fonksiyonun içini dolduracağız.

FUNCTION get_gelir_gider_tab(yil_ in varchar2,tarihbas_ in varchar2,tarihson_ in varchar2) RETURN gelir_gider_tab
PIPELINED IS
BEGIN
FOR rec IN (

--ço...ook uzun olabilecek bir select sorgusu

) LOOP
PIPE ROW(rec);
END LOOP;
RETURN;
end get_gelir_gider_tab;

Paket tanımında da fonksiyonumuzu yazdık. Artık tek satırlık bir sorgu ile raporumuzu çekebiliriz… Nasıl mı ??

 select * from TABLE(api_ismi.get_gelir_gider_tab('2018','1.1.2018','30.6.2018');

artık istediğiniz yerde bu satırı çağırarark 7500 satırlık sorgunuzu hem daha fazla performans ile hem de tek satır kod ile döndürebilirsiniz.

FAYDALANDIĞIM KAYNAK 

diğer ORACLE SQL makalelerim için

Oracle Pipeline başlıklı yazımızın sonuna geldik. Daha iyi yazılarda görüşmek dileğiyle 🙂

Oracle Pipeline, Pipelined Fonksiyonu Kullanımı
Oracle Pipeline, Pipelined Fonksiyonu Kullanımı