{"id":206,"title":"SQL Notlar\u0131:  Sakl\u0131 Yordamlar (Stored Procedures) ve Fonksiyonlar","content":"<p>MySQL'de sakl\u0131 yordamlar (stored procedures) ve fonksiyonlar, veritaban\u0131 i\u015flemlerini daha mod\u00fcler ve yeniden kullan\u0131labilir hale getirmek i\u00e7in kullan\u0131l\u0131r. Bu yaz\u0131da, sakl\u0131 yordamlar ve fonksiyonlar\u0131n nas\u0131l olu\u015fturulaca\u011f\u0131n\u0131, parametrelerle nas\u0131l \u00e7al\u0131\u015f\u0131laca\u011f\u0131n\u0131 ve cursor'lar\u0131n nas\u0131l kullan\u0131laca\u011f\u0131n\u0131 ele alaca\u011f\u0131z.<\/p><p>#### 1. Sakl\u0131 Yordamlar (Stored Procedures)<\/p><p>Sakl\u0131 yordamlar, birden fazla SQL ifadesini bir araya getirerek tek bir \u00e7a\u011fr\u0131 ile \u00e7al\u0131\u015ft\u0131r\u0131labilen yap\u0131lard\u0131r. `IN`, `OUT` ve `INOUT` parametreleri ile \u00e7al\u0131\u015fabilirler.<\/p><p>##### \u00d6rnek: IN, OUT, INOUT Parametreleri ile Sakl\u0131 Yordam<\/p><p>A\u015fa\u011f\u0131daki \u00f6rnekte, `IN`, `OUT` ve `INOUT` parametrelerini kullanan bir sakl\u0131 yordam olu\u015fturulmu\u015ftur:<\/p><p>```sql<br>DELIMITER $$<\/p><p>DROP PROCEDURE IF EXISTS sp_nested_loop$$ &nbsp;<br>CREATE PROCEDURE sp_nested_loop(IN i INT, IN j INT, OUT x INT, OUT y INT, INOUT z INT) &nbsp;<br>BEGIN &nbsp;<br>&nbsp; &nbsp;DECLARE a INTEGER DEFAULT 0; &nbsp;<br>&nbsp; &nbsp;DECLARE b INTEGER DEFAULT 0; &nbsp;<br>&nbsp; &nbsp;DECLARE c INTEGER DEFAULT 0; &nbsp;<br>&nbsp; &nbsp;WHILE a &lt; i DO &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp;WHILE b &lt; j DO &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SET c = c + 1; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SET b = b + 1; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp;END WHILE; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp;SET a = a + 1; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp;SET b = 0; &nbsp;<br>&nbsp; &nbsp;END WHILE; &nbsp;<br>&nbsp; &nbsp;SET x = a, y = c; &nbsp;<br>&nbsp; &nbsp;SET z = x + y + z; &nbsp;<br>END $$ &nbsp;<br>DELIMITER ;<br>```<\/p><p>Bu sakl\u0131 yordam\u0131 \u00e7a\u011f\u0131rmak i\u00e7in:<\/p><p>```sql<br>SET @z = 30; &nbsp;<br>CALL sp_nested_loop(10, 20, @x, @y, @z); &nbsp;<br>SELECT @x, @y, @z;<br>```<\/p><p>**Sonu\u00e7:**<br>```<br>+---+---+---+<br>| @x | @y | @z |<br>+---+---+---+<br>| 10 | 200 | 240 |<br>+---+---+---+<br>```<\/p><p>- `IN` parametresi, yordama bir de\u011fer ge\u00e7irir. Yordam bu de\u011feri de\u011fi\u015ftirebilir, ancak bu de\u011fi\u015fiklik \u00e7a\u011fr\u0131c\u0131ya yans\u0131maz.<br>- `OUT` parametresi, yordamdan \u00e7a\u011fr\u0131c\u0131ya bir de\u011fer d\u00f6nd\u00fcr\u00fcr. Ba\u015flang\u0131\u00e7ta `NULL` de\u011ferine sahiptir.<br>- `INOUT` parametresi, hem \u00e7a\u011fr\u0131c\u0131 taraf\u0131ndan ba\u015flat\u0131l\u0131r hem de yordam taraf\u0131ndan de\u011fi\u015ftirilebilir ve bu de\u011fi\u015fiklik \u00e7a\u011fr\u0131c\u0131ya yans\u0131r.<\/p><p>#### 2. Fonksiyon Olu\u015fturma<\/p><p>Fonksiyonlar, bir de\u011fer d\u00f6nd\u00fcren ve genellikle hesaplama veya d\u00f6n\u00fc\u015ft\u00fcrme i\u015flemleri i\u00e7in kullan\u0131lan yap\u0131lard\u0131r.<\/p><p>##### \u00d6rnek: Basit Bir Fonksiyon<\/p><p>A\u015fa\u011f\u0131daki \u00f6rnekte, sabit bir de\u011fer d\u00f6nd\u00fcren basit bir fonksiyon olu\u015fturulmu\u015ftur:<\/p><p>```sql<br>DELIMITER ||<br>CREATE FUNCTION functionname()<br>RETURNS INT<br>BEGIN<br>&nbsp; &nbsp;RETURN 12;<br>END;<br>||<br>DELIMITER ;<br>```<\/p><p>Bu fonksiyonu \u00e7a\u011f\u0131rmak i\u00e7in:<\/p><p>```sql<br>SELECT functionname();<br>```<\/p><p>**Sonu\u00e7:**<br>```<br>+---+<br>| functionname() |<br>+---+<br>| &nbsp; &nbsp;12 |<br>+---+<br>```<\/p><p>##### \u00d6rnek: Parametre Alan Fonksiyon<\/p><p>A\u015fa\u011f\u0131daki \u00f6rnekte, bir parametre alan ve bu parametreye 2 ekleyen bir fonksiyon olu\u015fturulmu\u015ftur:<\/p><p>```sql<br>DELIMITER $$<br>CREATE FUNCTION add_2 ( my_arg INT )<br>RETURNS INT<br>BEGIN<br>&nbsp; &nbsp;RETURN (my_arg + 2);<br>END;<br>$$&nbsp;<br>DELIMITER ;<br>```<\/p><p>Bu fonksiyonu \u00e7a\u011f\u0131rmak i\u00e7in:<\/p><p>```sql<br>SELECT add_2(12);<br>```<\/p><p>**Sonu\u00e7:**<br>```<br>+---+<br>| add_2(12) |<br>+---+<br>| &nbsp; &nbsp;14 |<br>+---+<br>```<\/p><p>#### 3. Cursor Kullan\u0131m\u0131<\/p><p>Cursor'lar, bir sorgunun sonu\u00e7lar\u0131n\u0131 sat\u0131r sat\u0131r i\u015flemek i\u00e7in kullan\u0131l\u0131r. \u00d6zellikle d\u00f6ng\u00fclerle birlikte kullan\u0131ld\u0131\u011f\u0131nda, her bir sat\u0131r \u00fczerinde i\u015flem yapmay\u0131 sa\u011flar.<\/p><p>##### \u00d6rnek: Cursor ile \u00dcr\u00fcn Say\u0131m\u0131<\/p><p>A\u015fa\u011f\u0131daki \u00f6rnekte, `product` tablosundaki her bir \u00fcr\u00fcn tipinin say\u0131s\u0131n\u0131 hesaplayan bir sakl\u0131 yordam olu\u015fturulmu\u015ftur:<\/p><p>```sql<br>DELIMITER \/\/<br>DROP PROCEDURE IF EXISTS product_count;<br>CREATE PROCEDURE product_count()<br>BEGIN<br>&nbsp; &nbsp;DECLARE p_type VARCHAR(255);<br>&nbsp; &nbsp;DECLARE p_count INT(10) UNSIGNED;<br>&nbsp; &nbsp;DECLARE done INT DEFAULT 0;<br>&nbsp; &nbsp;DECLARE product CURSOR FOR<br>&nbsp; &nbsp; &nbsp; &nbsp;SELECT type, COUNT(*)<br>&nbsp; &nbsp; &nbsp; &nbsp;FROM product<br>&nbsp; &nbsp; &nbsp; &nbsp;GROUP BY type;<br>&nbsp; &nbsp;DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;<\/p><p>&nbsp; &nbsp;TRUNCATE product_type_count;<\/p><p>&nbsp; &nbsp;OPEN product;<\/p><p>&nbsp; &nbsp;REPEAT<br>&nbsp; &nbsp; &nbsp; &nbsp;FETCH product INTO p_type, p_count;<br>&nbsp; &nbsp; &nbsp; &nbsp;IF NOT done THEN<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;INSERT INTO product_type_count (type, count)<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;VALUES (p_type, p_count);<br>&nbsp; &nbsp; &nbsp; &nbsp;END IF;<br>&nbsp; &nbsp;UNTIL done END REPEAT;<\/p><p>&nbsp; &nbsp;CLOSE product;<br>END \/\/<br>DELIMITER ;<br>```<\/p><p>Bu sakl\u0131 yordam\u0131 \u00e7a\u011f\u0131rmak i\u00e7in:<\/p><p>```sql<br>CALL product_count();<br>```<\/p><p>**Sonu\u00e7:**<br>```<br>type &nbsp;| count<br>------+------<br>dress | 2<br>food &nbsp;| 3<br>```<\/p><p>#### Sonu\u00e7<\/p><p>MySQL'de sakl\u0131 yordamlar ve fonksiyonlar, veritaban\u0131 i\u015flemlerini daha mod\u00fcler ve verimli hale getirmek i\u00e7in olduk\u00e7a kullan\u0131\u015fl\u0131d\u0131r. `IN`, `OUT` ve `INOUT` parametreleri ile esnek bir \u015fekilde \u00e7al\u0131\u015fabilir, cursor'lar ile sat\u0131r sat\u0131r i\u015flemler yapabilirsiniz. Bu ara\u00e7lar\u0131 etkili bir \u015fekilde kullanarak, veritaban\u0131 y\u00f6netimini daha kolay ve g\u00fcvenli hale getirebilirsiniz. Bir sonraki yaz\u0131da g\u00f6r\u00fc\u015fmek \u00fczere!<\/p>","excerpt":"MySQL'de sakl\u0131 yordamlar ve fonksiyonlar, veritaban\u0131 i\u015flemlerini daha mod\u00fcler ve verimli hale getirmek i\u00e7in olduk\u00e7a kullan\u0131\u015fl\u0131d\u0131r. `IN`, `OUT` ve `INOUT` parametreleri ile esnek bir \u015fekilde \u00e7al\u0131\u015fabilir, cursor'lar ile sat\u0131r sat\u0131r i\u015flemler yapabilirsiniz. Bu ara\u00e7lar\u0131 etkili bir \u015fekilde kullanarak, veritaban\u0131 y\u00f6netimini daha kolay ve g\u00fcvenli hale getirebilirsiniz.","created_at":"2025-01-13 15:29:32","updated_at":"2026-09-23 13:45:11","category_id":9,"view_count":573,"reading_time":4,"status":"published","editor_choice":0,"is_editor_choice":0,"published_at":"2025-01-13 15:29:32","featured_image":"resimyok.jpg","slug":"sql-notlari-sakli-yordamlar-stored-procedures-ve-fonksiyonlar","category_name":"Yaz\u0131l\u0131m","category_slug":"yazilim"}