Etiketler

, , ,


Pipelined Table Functions

Tablo fonksiyonları fiziksel veritabanı tabloları gibi sorgulanabilen satırlar koleksiyonu üretirler (“nested table” veya “varray” gibi ). Tablo fonksiyonunu veritabanı tablosu gibi FROM kısmında kullanabilirsiniz. Eğer data “pipelined” olarak tanımlanırsa, veri eklenir eklenmez kullanıcı tarafından kullanılır. Pipelining bir tablo fonksiyonunun satırları daha hızlı geri döndürmesini sağlar ve hafızada tablo fonksiyonların önbelleklemeye (caching) olan ihtiyaçlarını azaltırlar.Tablo fonksiyonları “virtual table” olarak da kullanılabilirler.

Aşağıdaki kod satırda VarChar2 tipinde sutunları olacak tbl_sozcukler isimli bir tablo fonksiyonu tanımlıyoruz.

CREATE OR REPLACE TYPE tbl_sozcukler as table of varchar2(32767);

Ve tbl_sozcukler tipi döndüren “split” isimli bir fonksiyon ile aldığımız Varchar2 türündeki sozcukListesi ‘ni önceden tanımladığımız ariyac a göre parçalayıp, her bir sözcüğü tbl_sozcukler a ekliyoruz. Burada yapmış olduğumuz ekleme tbl_sozcukler yi “pipelined” olarak tanımladığımız için fiziksel boyutta değildir.


CREATE OR REPLACE function split
(
sozcukListesi varchar2,
ariyac varchar2 := ','
) return tbl_sozcukler pipelined
is
ayiracIndisYeri pls_integer;
sozcukler varchar2(500) := sozcukListesi;


l_value varchar2(500);
begin
loop
ayiracIndisYeri := instr(sozcukler,ariyac);
if ayiracIndisYeri > 0 then
pipe row(substr(sozcukler,1,ayiracIndisYeri-1));
sozcukler := substr(sozcukler,ayiracIndisYeri+length(ariyac));


else
pipe row(sozcukler);
exit;
end if;
end loop;
return;
end split;
/


Pipelined olarak tanımladığımız tablo fonksiyonuna ;
Pipe row(Varchar2) ile satır ekliyoruz.

Eklediğimiz bu değerler yine pipelined olmasından kaynaklanan bir özellikle kullanıcı yarattığı anda tüketilmeye hazırdır. Dolayısıyla aşağıdaki sorgu ile aralarında virgül bulunan sözcükler grubunu eş zamanlı olarak parçalayıp, tbl_sozcukler ye satır satır ekleyip, stplit_tbl yi de veritabanında bulunan fiziksel bir tabloymus gibi From sentaks ı ile sorgulatabiliriz.

Örneğin, :pIlceKodu = “1,2,3,4,5,6,7” olsun. Aşağıdaki satırı çalıştırdığımızda;

Select column_value as ilceKodları From table(split(:pIlceKodu))

Sonucunu alırız.
ILCEKODLARI
1
2
3
4
5
6
7

Bu sayede store procedureler de IN sentaksı içine aralarınad virgüllü string parametre kullanmamız gerekirse;

ILCE_KODU IN (Select column_value From table(split(pIlceKodu)))

yardımıyla kodumuzu kullanabiliriz.

Bu sayede dinamik pl-sql cümleleri oluşturmaya, EXECUTE IMMEDIATE komudunu kullanma mecbur kalmayız.