Adem KALIN – Yazılım Mühendisi

Oracle [IN]/[OUT]/[IN OUT] Parametreler

InOracle ‘ın temel felsefesi subprogram (alt program) lar yani prosedür ve fonksiyonlar üzerine kuruludur. Her işi bir alt programa paslar ve işini tamamlamasını beklersiniz. Böylece yapılacak büyük bir işi, normal bir programlama dilindeki gibi küçük parçalara bölerek çözümünü basitleştirmiş olursunuz.

Bir alt program, kendi işini yaparken bazı durumlarda, içeride kullanmak için dışarıdan alacağı parametre değerlerine ihtiyaç duyar. Aldığı bu değerlere göre bir takım mantıksal veya matematiksel işlemler yapar ve bir sonuç ortaya çıkarır ve/veya bir güncelleme/silme/kayıt türetme yapar.

Buraya kadar anlattıklarımı hala okuyor iseniz, çok da yabancı şeyler değil size diye düşünüyorum 🙂

Alt programlarda kullanılacak olan bu parametrelerin amaca göre değerlerinin kullanım şekilleri de farklı olacaktır. Kimi zaman bir değişkenin değerini sadece okumamız yeterli olur. Kimi zaman ilk değeri önemli değildir, fakat alt programın içerisinde oluşan bir değeri, çağrıldığı yere bildirmesi gerekir. Bir anlamda yemeğin içine girmiş bir kepçe gibidir. Boş girer ancak dolu çıkar. Bazı zamanlardaysa bunların her ikisi de gerekebilir. Yani elinizde bir değişken vardır ve bu değişkenin değeri, alt programdaki mantığa göre değişecektir ve bu da çağrıldığı yerde kullanılacaktır. Bunu da yine yemekten bir örnekle açıklarsak, yemeğe tuzunu attığımız ve sonrasında da tuz seviyesini kontrol ettiğimiz bir kaşığı düşünebiliriz 🙂 Önce bir miktar tuzu kaşığa koyarız ve yemeğin içerisine karıştırırız, sonrasında da yemekten bir parça alarak tuzuna bakarız. Buradaki yemek tenceresini bir alt program, kaşığı parametre, tuzu bu parametrenin giriş değeri, yemek parçasını ise çıkış değeri olarak düşünebiliriz.

Konuyu bu kadar ayrıntılandırdık fakat bunların teknik karşılığını bilmezsek bir anlamı da olmaz. Yukarıda yazdığımız mantığı göz önünde bulundurusak, yazacağımız bir alt programda kullanacağımız parametreleri 3 tipte kabul edebiliriz

IN : Sadece veri girişi için kullanılır. Değeri alt program içerisinde set edilemez.

OUT : Sacece veri almak için kullanılır. Değeri alt program içerisinde set edilir ve dışarıya dönülür.

IN OUT : Hem veri girişi hem veri çıkışında kullanılır. Değeri alt program içerisinde set edilebilir ve program sonlandığında sahip olduğu son değeri dışarıya döndürür.

Peki ya bunları kullanırken nelere dikkat etmeliyiz?

IN_Parameter

Öncelikle yaşadıklarımdan yola çıkarak en çok şaşırabileceğiniz nokta, OUT tipindeki parametrelerdir. Çünkü bu türden bir parametrenin değeri alt programa girdiği anda ilklenecektir, yani default değeri ne ise o atanacaktır. Dolayısıyla siz programı çağırdığınız yerde parametre bir değere sahip olsa dahi, program içerisinde yeniden ilk değeri atanarak kullanılmaya başlanacaktır. Mesela NUMBER tipte bir OUT paramtre kullanırken, çağırdığınız yerde (sallıyorum) 53987 gibi bir değer dahi verseniz, programın içerisine girdiği anda değeri 0 olarak atanacak ve ona göre işlem yapılacak, nihayetinde ise 0 ‘a göre üretilmiş değeri dışarıya dönülecektir. Yani aslında OUT parametrelerin kullanım amacı, sadece değer dönmektir. Eğer vereceğiniz bir değer göz önünde bulundurularak bir sonuç üretilmesini istiyorsanız 3. seçenekteki IN OUT paramtre seçeneğini kullanmalısınız.

OUT_Parameter

İkinci bir dikkat edilmesi gereken nokta ise, IN tipindeki bir parametreye alt program içerisinde atama yapmaya çalıştığınızda hata alırsınız ve program parçası derlenmez.

Son olarak, Oracle’da bir parametre için bu tiplerden herhangi birini kullanmazsanız, Oracle default olarak IN Parametre gibi hareket eder.

IN_OUT_Parameter

Bu anlattıklarımızı bir kod örneği ile pekiştirmeliyiz diye düşünüyorum. Aşağıdaki script ile, çok basitçe yukarıdaki anlattığım noktaları vurgulamaya çalıştım. Scripti çalıştırdığımızda alt satırlarda çıktı oluşacaktır. Çıktıyı incelediğinizde 6. satırda “v2 = 0” çıktısı elde edilecektir.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
CREATE PROCEDURE SP_Proc1 (p1 NUMBER) AS
	v1 NUMBER;
	v2 NUMBER;
	v3 NUMBER; 
BEGIN
	v1 := 30;
	v2 := 40;
	v3 := 50;
 
	DBMS_OUTPUT.PUT_LINE('v1 = ' || TO_CHAR(v1));
	DBMS_OUTPUT.PUT_LINE('v2 = ' || TO_CHAR(v2));
	DBMS_OUTPUT.PUT_LINE('v3 = ' || TO_CHAR(v3));
 
	SP_Proc2(v1, v2, v3);
 
	DBMS_OUTPUT.PUT_LINE('SP_Proc1');	
	DBMS_OUTPUT.PUT_LINE('v1 = ' || TO_CHAR(v1));
	DBMS_OUTPUT.PUT_LINE('v2 = ' || TO_CHAR(v2));
	DBMS_OUTPUT.PUT_LINE('v3 = ' || TO_CHAR(v3));
 
END SP_Proc1;
/
CREATE PROCEDURE SP_Proc2 (p1 IN NUMBER, p2 OUT NUMBER, p3 IN OUT NUMBER) AS 
BEGIN
	DBMS_OUTPUT.PUT_LINE('SP_Proc2 - 1');
	DBMS_OUTPUT.PUT_LINE('v1 = ' || TO_CHAR(v1));
	DBMS_OUTPUT.PUT_LINE('v2 = ' || TO_CHAR(v2));
	DBMS_OUTPUT.PUT_LINE('v3 = ' || TO_CHAR(v3));
 
	--v1 := 31; /*Böyle bir satır derleme hatasına sebep olacaktır.*/
 
	v2 := 41;
	v3 := 51;
 
	DBMS_OUTPUT.PUT_LINE('SP_Proc2 - 2');
	DBMS_OUTPUT.PUT_LINE('v2 = ' || TO_CHAR(v2));
	DBMS_OUTPUT.PUT_LINE('v3 = ' || TO_CHAR(v3));
 
END SP_Proc2;

OUTPUT:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
v1 = 30
v2 = 40
v3 = 50
SP_Proc2 - 1
v1 = 30
v2 = 0
v3 = 50
SP_Proc2 - 2
v2 = 41
v3 = 51
SP_Proc1
v1 = 30
v2 = 41
v3 = 51

Konuyla ilgili Oracle’dan da referans almak isteyenler için basitçe bir özet sunabiliriz :

Oracle_Parameter_Modes

2 thoughts on “Oracle [IN]/[OUT]/[IN OUT] Parametreler

  1. sekman umut

    Merhabalar ,
    Bu güzel , anlaşılır anlatımınız için teşekkür ederim.
    Parametlerin farkı , dikkat edilmesi gereken hususlar , anlatım sırasındaki ve sonrasındaki kod örneğiniz konuyu çok anlaşılır kılmış.

    PL/SQL ve Oracle ile ilgili yazılarınızın devamını beklerim.

    1. Adem KALIN Post author

      İlginiz ve güzel yorumunuz için teşekkür ederim. Mümkün olduğunca, kendimin de anladığı gibi en basit dili kullanmaya çalışıyorum. Herkesin bildiği yada heryerde ulaşılabilecek konulardan ziyade, karşılaştığım farklı noktaları irdelemeye çalışıyorum.

      Takipte kalmanız dileğiyle 🙂

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir