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!