SQL Notları: Saklı Yordamlar (Stored Procedures) ve Fonksiyonlar

MySQL’de saklı yordamlar (stored procedures) ve fonksiyonlar, veritabanı işlemlerini daha modüler ve yeniden kullanılabilir hale getirmek için kullanılır. Bu yazıda, saklı yordamlar ve fonksiyonların nasıl oluşturulacağını, parametrelerle nasıl çalışılacağını ve cursor’ların nasıl kullanılacağını ele alacağız.

#### 1. Saklı Yordamlar (Stored Procedures)

Saklı yordamlar, birden fazla SQL ifadesini bir araya getirerek tek bir çağrı ile çalıştırılabilen yapılardır. `IN`, `OUT` ve `INOUT` parametreleri ile çalışabilirler.

##### Örnek: IN, OUT, INOUT Parametreleri ile Saklı Yordam

Aşağıdaki örnekte, `IN`, `OUT` ve `INOUT` parametrelerini kullanan bir saklı yordam oluşturulmuştur:

“`sql
DELIMITER $$

DROP PROCEDURE IF EXISTS sp_nested_loop$$  
CREATE PROCEDURE sp_nested_loop(IN i INT, IN j INT, OUT x INT, OUT y INT, INOUT z INT)  
BEGIN  
   DECLARE a INTEGER DEFAULT 0;  
   DECLARE b INTEGER DEFAULT 0;  
   DECLARE c INTEGER DEFAULT 0;  
   WHILE a < i DO  
       WHILE b < j DO  
           SET c = c + 1;  
           SET b = b + 1;  
       END WHILE;  
       SET a = a + 1;  
       SET b = 0;  
   END WHILE;  
   SET x = a, y = c;  
   SET z = x + y + z;  
END $$  
DELIMITER ;
“`

Bu saklı yordamı çağırmak için:

“`sql
SET @z = 30;  
CALL sp_nested_loop(10, 20, @x, @y, @z);  
SELECT @x, @y, @z;
“`

**Sonuç:**
“`
+—+—+—+
| @x | @y | @z |
+—+—+—+
| 10 | 200 | 240 |
+—+—+—+
“`

– `IN` parametresi, yordama bir değer geçirir. Yordam bu değeri değiştirebilir, ancak bu değişiklik çağrıcıya yansımaz.
– `OUT` parametresi, yordamdan çağrıcıya bir değer döndürür. Başlangıçta `NULL` değerine sahiptir.
– `INOUT` parametresi, hem çağrıcı tarafından başlatılır hem de yordam tarafından değiştirilebilir ve bu değişiklik çağrıcıya yansır.

#### 2. Fonksiyon Oluşturma

Fonksiyonlar, bir değer döndüren ve genellikle hesaplama veya dönüştürme işlemleri için kullanılan yapılardır.

##### Örnek: Basit Bir Fonksiyon

Aşağıdaki örnekte, sabit bir değer döndüren basit bir fonksiyon oluşturulmuştur:

“`sql
DELIMITER ||
CREATE FUNCTION functionname()
RETURNS INT
BEGIN
   RETURN 12;
END;
||
DELIMITER ;
“`

Bu fonksiyonu çağırmak için:

“`sql
SELECT functionname();
“`

**Sonuç:**
“`
+—+
| functionname() |
+—+
|    12 |
+—+
“`

##### Örnek: Parametre Alan Fonksiyon

Aşağıdaki örnekte, bir parametre alan ve bu parametreye 2 ekleyen bir fonksiyon oluşturulmuştur:

“`sql
DELIMITER $$
CREATE FUNCTION add_2 ( my_arg INT )
RETURNS INT
BEGIN
   RETURN (my_arg + 2);
END;
$$ 
DELIMITER ;
“`

Bu fonksiyonu çağırmak için:

“`sql
SELECT add_2(12);
“`

**Sonuç:**
“`
+—+
| add_2(12) |
+—+
|    14 |
+—+
“`

#### 3. Cursor Kullanımı

Cursor’lar, bir sorgunun sonuçlarını satır satır işlemek için kullanılır. Özellikle döngülerle birlikte kullanıldığında, her bir satır üzerinde işlem yapmayı sağlar.

##### Örnek: Cursor ile Ürün Sayımı

Aşağıdaki örnekte, `product` tablosundaki her bir ürün tipinin sayısını hesaplayan bir saklı yordam oluşturulmuştur:

“`sql
DELIMITER //
DROP PROCEDURE IF EXISTS product_count;
CREATE PROCEDURE product_count()
BEGIN
   DECLARE p_type VARCHAR(255);
   DECLARE p_count INT(10) UNSIGNED;
   DECLARE done INT DEFAULT 0;
   DECLARE product CURSOR FOR
       SELECT type, COUNT(*)
       FROM product
       GROUP BY type;
   DECLARE CONTINUE HANDLER FOR SQLSTATE ‘02000’ SET done = 1;

   TRUNCATE product_type_count;

   OPEN product;

   REPEAT
       FETCH product INTO p_type, p_count;
       IF NOT done THEN
           INSERT INTO product_type_count (type, count)
           VALUES (p_type, p_count);
       END IF;
   UNTIL done END REPEAT;

   CLOSE product;
END //
DELIMITER ;
“`

Bu saklı yordamı çağırmak için:

“`sql
CALL product_count();
“`

**Sonuç:**
“`
type  | count
——+——
dress | 2
food  | 3
“`

#### Sonuç

MySQL’de saklı yordamlar ve fonksiyonlar, veritabanı işlemlerini daha modüler ve verimli hale getirmek için oldukça kullanışlıdır. `IN`, `OUT` ve `INOUT` parametreleri ile esnek bir şekilde çalışabilir, cursor’lar ile satır satır işlemler yapabilirsiniz. Bu araçları etkili bir şekilde kullanarak, veritabanı yönetimini daha kolay ve güvenli hale getirebilirsiniz. Bir sonraki yazıda görüşmek üzere!