Etiket Arşivi plsql türkçe fonksiyonlar

PL/SQL 5: Fonksiyonlar

Merhabalar.

Bu yazıda fonksiyonlardan bahsetmeye çalışacağım.
Fonksiyonlar bir önceki yazıda bahsettiğim prosedürler ile yapısal açıdan çok benzemektedir.
Yapısal açıdan tek farkı geriye değer dönmesidir diyebiliriz.
Hatta şunu da söyleyebiliriz: İşlev açısından prosedürler java/c#’taki void metodlara, fonksiyonlar ise değer dönen (string, int, bool vs.) metodlara benzer.

Fonksiyonların blok yapısı aşağıdaki gibidir:

CREATE [OR REPLACE] FUNCTION fonksiyon_adi
  [(parametre1 [mode] veritipi1,
  parametre2 [mode] veritipi2, ...)]
RETURN donen_degerin_veri_tipi
IS|AS
  [yerel_degisken_tanimlari; …]
BEGIN
  -- islemler;
  RETURN donen_deger
END [prosedur_adi];

 

Örnekler için kullanacağım ogrenci tablosu aşağıda:

sp1

Prosedürlerde yaptığım örneği burada da uygulayabilirim.
Tablodaki en yüksek not ortalamasını getiren bir fonksiyon oluşturuyorum:

CREATE OR REPLACE FUNCTION max_ortalama_getir
RETURN NUMBER
IS
v_max_ortalama NUMBER:=0;

BEGIN
	SELECT	MAX (not_ortalama) INTO v_max_ortalama FROM ogrenci;

	RETURN v_max_ortalama;
END max_ortalama_getir;

..ve bu fonksiyonu aşağıdaki gibi kullanıyorum:

BEGIN
dbms_output.put_line('En yüksek ortalama: '||max_ortalama_getir);
END;

Çıktı:

fonksiyon1

Parametre yapısı tamamen prosedürlerle aynı. O yüzden orada yazdığımı tekrar ediyorum:
Fonksiyonlara 3 tip parametre gönderebiliyoruz:
IN: Bu tiple fonksiyona parametre gönderilip içeride kullanılır.
OUT: Bu tip ile gönderilen parametreye, fomksiyonun içinde değer atanıp OUT edilir.
IN OUT: Bu tip ile de içeriye değer gönderilip, gerekirse değiştirilerek tekrar OUT edilir.

OUT ile IN OUT arasındaki fark tahmin edeceğiniz gibi, OUT gönderilen parametreye dışarıda değer atanmış bile olsa, prosedürün içinde bu değerin kullanılamaması.

NOT: Fonksiyonun kullanım amacı gereği, OUT ve IN OUT tipinde parametre kullanılmaması önerilir. Fonksiyonların kullanımında esas olan, direkt işlemlerin içinde(yukarıdaki örnekteki gibi) kullanılacak şekilde, tek bir değer dönmesidir.

Biz yine de OUT parametreli bir örnek yapalım:

CREATE OR REPLACE FUNCTION ogrenci_bilgi_function(p_no IN NUMBER, p_ad OUT VARCHAR2, p_soyad OUT VARCHAR2)
RETURN NUMBER
IS
p_yuzluk_sistem_not NUMBER:=25;
BEGIN
    SELECT  ad, soyad, not_ortalama * p_yuzluk_sistem_not
      INTO  p_ad, p_soyad, p_yuzluk_sistem_not
      FROM  ogrenci
     WHERE  no = p_no;

RETURN p_yuzluk_sistem_not;
END; 

Fonksiyonuma IN olarak gönderilen numaranın not ortalamasını basitçe 4’lük sistemden 100’lük sisteme çevirip RETURN ediyorum.

NOT: Buradaki SELECT INTO yapısı sayesinde SELECT kısmında gelen değerleri, INTO kısmındaki değişkenlere atayabiliyorum.

Aşağıdaki kodla, gelen ortalamayı konsola yazdırabilirim:

DECLARE
v_ad VARCHAR2(20);
v_soyad VARCHAR2(20);
BEGIN
dbms_output.put_line(ogrenci_bilgi_function(1,v_ad,v_soyad));
dbms_output.put_line(v_ad||' '||v_soyad);
END;

Sonuç aşağıdaki gibi oluyor:

func
Burada gördüğümüz gibi v_ad ve v_soyad değişkenlerini de doldurabiliyorum(hatta IN OUT değer de gönderip, doldurabilirdim), ama bahsettiğim gibi fonksiyonların kullanım mantığı gereği OUT değer barındıracak yapıları prosedür olarak oluşturmak daha iyi olacaktır.

Kendinize çook iyi davranın.

 Bu sayfa 6060 kez görüntülendi

It's only fair to share...Share on LinkedInShare on FacebookShare on Google+Tweet about this on TwitterShare on Tumblr