ben

OMÜ , Bilgisayar Mühendisliği, 13'

3 Mart 2022 Perşembe

Parametreli Procedure

 PostgreSQL yapısında procedure yapıları sadece in yapıda parametre alırlar sql yada oracle yapısındaki gibi output parametre yapısı yoktur. Eğer out yapıda program yazacaksanız bunu fonksiyon olarak yazmanızı isteyecektir. 

Verilen category ismine göre film listesini getiren procedure yapısını sql ve oracle yapısında getirebilirken, postgresql yapısında buna izin verilmez, eğer geriye bir liste ya da table dönecekse bunu fonksiyonlar ile yapabiliriz. Fakat sorgu sonucunda elde edilen bir iki veriyi değişkenlere atarak ekrana sonucu yazdırabilirsiniz.

O zaman örneğimizi şua şekilde yazalım:  category ismine göre film sayısını getiren procedure yapısını postgresql de kodlamasını yapalım.


create or replace procedure sp_categoryFilm( category_name varchar)
language plpgsql
as $$
declare sayi int:=0;
begin
     select count(*) into sayi from category cg
     inner join film_category fc on fc.category_id=cg.category_id
     inner join film fl on fl.film_id=fc.film_id
     where cg.name=category_name;
     raise notice 'film_sayisi :%', sayi;
end; $$

Procedure yapısını çağıralım:   

call sp_categoryFilm('Action')


Bu sefer hem category hem de yıl verisine göre film sayısını getiren procedure yazalım.

create or replace procedure sp_categoryFilm( category_name varchar, film_year year )
language plpgsql
as $$
declare sayi int:=0;
begin
select count(*) into sayi from category cg 
inner join film_category fc on fc.category_id=cg.category_id
inner join film fl on fl.film_id=fc.film_id
where cg.name=category_name and release_year=film_year;
raise notice 'film_sayisi :%', sayi;
end; $$

Procedure yapısını çağıralım:   

call sp_categoryFilm('Action','2006')


Peki burada sadece yıl bilgisi yada sadece kategori bilgisi girilsin istersek, yani dinamik bir procedure yapısını nasıl yapardık. Hngi parametre gönderilirse o parametreye göre sorgu filtreleme yapsın , ona göre sonuc getirsin.


create or replace procedure sp_categoryFilm( category_name varchar, film_year year )
language plpgsql
as $$
declare sayi int:=0;
begin
select count(*) into sayi from category cg 
inner join film_category fc on fc.category_id=cg.category_id
inner join film fl on fl.film_id=fc.film_id
where cg.name=COALESCE(category_name, cg.name)  
and release_year=COALESCE(film_year, release_year);

raise notice 'film_sayisi :%', sayi;
end; $$


Sadece Action kategorisindeki filmler için;
    call sp_sp_categoryFilm('Action',null)

Sadece 2006 yılındaki filmler için;
        call sp_sp_categoryFilm(null,2006)

Hem 2006 hemde Action kategorisindeki filmler için;
    call sp_sp_categoryFilm('Action',2006)

NOT: Burada Coalesce komutu, verilen ilk parametreye bakar eğer parametre null değilse where şartına ilk parametreyi gönderir. Eğer null ise ikinci parametreyi gönderir. Bu durumda 1=1 şartına benzer buda where şartını geçersiz kılar. BU şekilde parametreli dinamik procedure yapıları yazabiliriz.

Hiç yorum yok: