Etiket Arşivi sp

PL/SQL 4: Stored Procedure(Saklı Yordam)

Merhabalar.

Bu yazıda “Stored Procedure” lerden yani -hiç sevemediğim tabirle- saklı yordamlardan bahsetmeye çalışacağım. Ben kısaca SP veya prosedür demeyi tercih ediyorum.

* SPler şemaların altında oluşturulan veritabanı nesneleridir.

* İlk oluşturulduğunda derlenir ve sonraki defalar direkt çalıştırılır.

* Pek çok işlemin yapılabileceği(SQL sorguları çalıştırılabilir, döngü ve şart yapıları kullanılabilir vs.), veritabanında saklanan, C# veya Java’daki metodların benzeri(tam karşılığı değil belirli özellikleriyle benzer) yapılardır.

* Blok yapısı aşağıdaki gibidir:

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

Örneklere geçmeden önce kullanacağım tabloya göz atmakta fayda var. Tablonun ismi ogrenci. Aşağıdaki kolonlar ve değerler var tabloda:

sp1

İlk etapta aşağıdaki gibi parametresiz bir SP oluşturarak, basitçe en yüksek not ortalamasını ekrana yazdıralım.

CREATE OR REPLACE PROCEDURE max_ortalama_yazdir
IS
	v_max_ortalama   NUMBER := 0;
BEGIN
	SELECT	MAX (not_ortalama) INTO v_max_ortalama FROM ogrenci;

	DBMS_OUTPUT.put_line ('En yüksek ortalama: ' || v_max_ortalama);
END max_ortalama_yazdir;

Buradaki SELECT INTO yapısı, seçilen değerin, verilen değişkene atanmasını sağlıyor. Yani maksimum not değerini v_max_ortalama isimli yerel değişkenimize atıyor. Daha sonra o bu değeri ekrana yazdırıyoruz. Prosedürü aşağıdaki gibi çalıştırabiliriz:

BEGIN
max_ortalama_yazdir;
END;

..ve çıktı:
sp2

Şimdi gelelim parametre yapısına. SPlere 3 tip parametre gönderebiliyoruz:
IN: Bu tiple prosedüre parametre gönderilip içeride kullanılır.
OUT: Bu tip ile gönderilen parametreye, prosedürün 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ı.

Aşağıdaki gibi bir örnekle parametre yapısını inceleyebiliriz. Örnekte prosedüre gönderilen no ile öğrencinin adı,soyadı ve not ortalamasının 100’lük sistemdeki karşılığı geri dönülüyor. Burada p_yuzluk_sistem_not değişkenini 25 olarak gönderip, 4’lük sistemdeki ortalamayı bununla çarparak, çıkan sonucu tekrar p_yuzluk_sistem_not değişkenine atıyorum. Prosedüre p_no parametresini IN, p_ad ve p_soyad parametrelerini OUT, p_yuzluk_sistem_not parametresini ise IN OUT olarak gönderiyorum.

CREATE OR REPLACE PROCEDURE ogrenci_bilgi(p_no IN NUMBER,
                                          p_ad OUT VARCHAR2,
                                          p_soyad OUT VARCHAR2,
                                          p_yuzluk_sistem_not IN OUT NUMBER)
IS
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 ;
END;

Aşağıdaki bloktan da prosedürümü çağırarak neler olduğuna bakıyorum:

DECLARE
	v_no			NUMBER := 1;
	v_ad			VARCHAR2 (10);
	v_soyad			VARCHAR2 (20);
	v_yuzluk_sistem_not	NUMBER := 25;
BEGIN
	ogrenci_bilgi (v_no, v_ad, v_soyad, v_yuzluk_sistem_not);
	DBMS_OUTPUT.put_line ('No: ' || v_no);
	DBMS_OUTPUT.put_line ('İsim: ' || v_ad || ' ' || v_soyad);
	DBMS_OUTPUT.put_line ('Yüzlük sistemdeki not: ' || v_yuzluk_sistem_not);
END;

Görüldüğü gibi v_ad ve v_soyad değişkenlerinin değerleri tamamen prosedür içerisinde oluşturuldu. Yine v_yuzluk_sistem_not değişkeninin de değeri 25 olarak set edildiği halde, prosedürün içinde değişikliğe uğradı.

Kendinize çook iyi davranın.

 

Bu sayfa 1726 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