<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>sql arşivleri - Keşif Ruhu</title>
	<atom:link href="https://www.kesifruhu.com/tag/sql/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.kesifruhu.com/tag/sql/</link>
	<description>Keşfet, Deneyimle, Paylaş</description>
	<lastBuildDate>Wed, 11 Sep 2024 08:44:21 +0000</lastBuildDate>
	<language>tr</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.3</generator>

<image>
	<url>https://www.kesifruhu.com/wp-content/uploads/2024/09/siteico-150x150.png</url>
	<title>sql arşivleri - Keşif Ruhu</title>
	<link>https://www.kesifruhu.com/tag/sql/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>PL/pgSQL: PostgreSQL İçin Güçlü Bir Prosedürel Dil</title>
		<link>https://www.kesifruhu.com/yazilim/veri-tabanlari/pl-pgsql-postgresql-icin-guclu-bir-prosedurel-dil/</link>
					<comments>https://www.kesifruhu.com/yazilim/veri-tabanlari/pl-pgsql-postgresql-icin-guclu-bir-prosedurel-dil/#respond</comments>
		
		<dc:creator><![CDATA[darklaz]]></dc:creator>
		<pubDate>Tue, 10 Sep 2024 12:31:21 +0000</pubDate>
				<category><![CDATA[Veri Tabanları]]></category>
		<category><![CDATA[Yazılım]]></category>
		<category><![CDATA[pl/pgsql]]></category>
		<category><![CDATA[pl/sql]]></category>
		<category><![CDATA[postgresql]]></category>
		<category><![CDATA[sql]]></category>
		<guid isPermaLink="false">https://www.kesifruhu.com/?p=286</guid>

					<description><![CDATA[<p>PL/pgSQL, PostgreSQL veritabanı sisteminde kullanılan ve veri manipülasyonu işlemlerini daha esnek ve güçlü hale getiren bir prosedürel programlama dilidir.</p>
<p><a href="https://www.kesifruhu.com/yazilim/veri-tabanlari/pl-pgsql-postgresql-icin-guclu-bir-prosedurel-dil/">PL/pgSQL: PostgreSQL İçin Güçlü Bir Prosedürel Dil</a> yazısı ilk önce <a href="https://www.kesifruhu.com">Keşif Ruhu</a> üzerinde ortaya çıktı.</p>
]]></description>
										<content:encoded><![CDATA[
<p>PL/pgSQL, PostgreSQL veritabanı sisteminde kullanılan ve veri manipülasyonu işlemlerini daha esnek ve güçlü hale getiren bir prosedürel programlama dilidir. PL/pgSQL ile SQL sorguları ve prosedürel dillerin kontrol yapıları bir arada kullanılabilir, bu da daha karmaşık işlemlerin yapılmasına olanak sağlar.</p>



<p>Bu makalede, PL/pgSQL&#8217;in temel özelliklerine giriş mahiyetinde, kullanım alanlarını ve bazı örnek kodlarla nasıl kullanılacağını basit örneklerle inceleyeceğiz. Sonraki makalelerimizde farklı örnekler ile detaylı bir gezinti yapacağız.</p>



<h3 class="wp-block-heading">PL/pgSQL&#8217;in Avantajları</h3>



<p>PL/pgSQL kullanımı, birçok avantaj sağlar:</p>



<ol class="wp-block-list">
<li><strong>SQL İle Kolay Entegrasyon</strong>: PL/pgSQL, PostgreSQL &#8216;de bulunan SQL sorguları ile sıkı bir entegrasyon içinde çalışır. Bu, hem veri tabanında işlemlerin hızlı yapılmasını hem de SQL sorgularını prosedürel yapılar içinde kullanmayı kolaylaştırır.</li>



<li><strong>Gelişmiş Veri İşleme</strong>: Kontrol yapıları (IF, LOOP, CASE vb.) sayesinde veri işleme işlemleri üzerinde daha fazla kontrol sağlar.</li>



<li><strong>Performans İyileştirmesi</strong>: Karmaşık SQL sorgularını ve işlemlerini prosedürel yapılar kullanarak daha verimli hale getirebilir.</li>



<li><strong>Hata Yakalama ve Yönetimi</strong>: EXCEPTION yapısıyla hatalar yakalanabilir ve bu hatalar için özel işlemler yapılabilir.</li>
</ol>



<p>PL/pgSQL, PostgreSQL de Procedure ve Fonksiyon olmak üzere iki yapı içinde kullanılır. Bu iki yapıyı sonraki makalelerimizde işleyeceğiz. Bu makalede temel olarak fonksiyon yapılarını baz alacağız.</p>



<h3 class="wp-block-heading">PL/pgSQL ile Fonksiyonlar</h3>



<p>PL/pgSQL&#8217;in en yaygın kullanıldığı yerlerden biri fonksiyonlardır. Bir fonksiyon, belirli bir görevi yerine getiren bir kod bloğudur. Fonksiyonlar, veri manipülasyonu ve işleme işlemlerinde büyük kolaylık sağlar.</p>



<p>PL/pgSQL dilinde bir fonksiyon ya da prosedür yazarken aşağıdaki yapısal öğeler kullanılır:</p>



<ul class="wp-block-list">
<li><strong>DECLARE</strong>: Değişkenler ve sabitler burada tanımlanır.</li>



<li><strong>BEGIN&#8230;END</strong>: prosedürel kod bloğu bu iki ifade arasında yazılır.</li>



<li><strong>EXCEPTION</strong>: Hata yakalama ve yönetimi bu blokta gerçekleştirilir.</li>



<li><strong>RETURN</strong>: Fonksiyon sonucunu döndüren komuttur. Fonksiyon bir veri döndüreceği gibi, herhangi bir değer de döndürmeyebilir. (void)</li>
</ul>



<p>Örnek bir PL/pgSQL fonksiyonunun temel yapısı şu şekildedir:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PLSQL</span><span role="button" tabindex="0" data-code="CREATE OR REPLACE FUNCTION fonksiyon_adi(parametreler) 
RETURNS dönen_veri_tipi AS $$
DECLARE
    -- Burada değişken tanımlamaları yapılabilir
BEGIN
    -- Ana işlem bloğu burada bulunur
    RETURN bir_deger;
EXCEPTION
    -- Hata yakalama burada yapılır
END;
$$ LANGUAGE plpgsql;
" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">CREATE OR REPLACE</span><span style="color: #D4D4D4"> FUNCTION fonksiyon_adi(parametreler) </span></span>
<span class="line"><span style="color: #D4D4D4">RETURNS dönen_veri_tipi </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> $$</span></span>
<span class="line"><span style="color: #569CD6">DECLARE</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">-- Burada değişken tanımlamaları yapılabilir</span></span>
<span class="line"><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">-- Ana işlem bloğu burada bulunur</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">RETURN</span><span style="color: #D4D4D4"> bir_deger;</span></span>
<span class="line"><span style="color: #569CD6">EXCEPTION</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">-- Hata yakalama burada yapılır</span></span>
<span class="line"><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">$$ </span><span style="color: #569CD6">LANGUAGE</span><span style="color: #D4D4D4"> plpgsql;</span></span>
<span class="line"></span></code></pre></div>



<p></p>



<p>Bu yapı, PL/pgSQL fonksiyonlarının temeli olup, daha karmaşık fonksiyonların yazılması için de esneklik sağlar.</p>



<h4 class="wp-block-heading">Örnek 1: Basit Bir PL/pgSQL Fonksiyonu</h4>



<p>Aşağıda, iki tam sayı alan ve bu iki sayıyı toplayarak sonucu döndüren bir fonksiyonun nasıl tanımlanacağına dair basit bir örnek bulabilirsiniz: </p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PLSQL</span><span role="button" tabindex="0" data-code="CREATE OR REPLACE FUNCTION topla(a INT, b INT) RETURNS INT AS $$
BEGIN
    RETURN a + b;
END;
$$ LANGUAGE plpgsql;" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">CREATE OR REPLACE</span><span style="color: #D4D4D4"> FUNCTION topla(a INT, b INT) RETURNS INT </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> $$</span></span>
<span class="line"><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">RETURN</span><span style="color: #D4D4D4"> a + b;</span></span>
<span class="line"><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">$$ </span><span style="color: #569CD6">LANGUAGE</span><span style="color: #D4D4D4"> plpgsql;</span></span></code></pre></div>



<p></p>



<p>Fonksiyonun kullanımı;</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PLSQL</span><span role="button" tabindex="0" data-code="SELECT topla(10, 20);  -- Çıktı: 30
" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> topla(</span><span style="color: #B5CEA8">10</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">20</span><span style="color: #D4D4D4">);  </span><span style="color: #6A9955">-- Çıktı: 30</span></span>
<span class="line"></span></code></pre></div>



<p></p>



<h3 class="wp-block-heading">PL/pgSQL ile Veri Manipülasyonu</h3>



<p>PL/pgSQL, SQL sorgularını prosedürel yapı ile birleştiren bir dildir. Bu, SQL’in sunduğu güçlü veri sorgulama özelliklerini, programlama mantığı ile bir arada kullanmayı sağlar.</p>



<h4 class="wp-block-heading">Örnek 1: Basit Bir Veri Ekleme Fonksiyonu</h4>



<p>Bir çalışanın bilgilerini bir tabloya bir fonksiyonu en sade şekilde tanımlayalım. </p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PLSQL</span><span role="button" tabindex="0" data-code="CREATE TABLE calisanlar (
    id SERIAL PRIMARY KEY,
    isim TEXT,
    yas INTEGER,
    pozisyon TEXT
);

CREATE OR REPLACE FUNCTION calisan_ekle(_isim TEXT, _yas INT, _pozisyon TEXT) 
RETURNS VOID AS $$
BEGIN
    INSERT INTO calisanlar (isim, yas, pozisyon) 
    VALUES (_isim, _yas, _pozisyon);
END;
$$ LANGUAGE plpgsql;
" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">CREATE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">TABLE</span><span style="color: #D4D4D4"> calisanlar (</span></span>
<span class="line"><span style="color: #D4D4D4">    id SERIAL </span><span style="color: #569CD6">PRIMARY KEY</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    isim TEXT,</span></span>
<span class="line"><span style="color: #D4D4D4">    yas </span><span style="color: #569CD6">INTEGER</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    pozisyon TEXT</span></span>
<span class="line"><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">CREATE OR REPLACE</span><span style="color: #D4D4D4"> FUNCTION calisan_ekle(_isim TEXT, _yas INT, _pozisyon TEXT) </span></span>
<span class="line"><span style="color: #D4D4D4">RETURNS VOID </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> $$</span></span>
<span class="line"><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">INSERT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">INTO</span><span style="color: #D4D4D4"> calisanlar (isim, yas, pozisyon) </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">VALUES</span><span style="color: #D4D4D4"> (_isim, _yas, _pozisyon);</span></span>
<span class="line"><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">$$ </span><span style="color: #569CD6">LANGUAGE</span><span style="color: #D4D4D4"> plpgsql;</span></span>
<span class="line"></span></code></pre></div>



<p></p>



<p>Bu fonksiyonu çağırarak yeni bir çalışan kaydedebilirsiniz;</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PLSQL</span><span role="button" tabindex="0" data-code="SELECT calisan_ekle('Ali Veli', 30, 'Yazılım Mühendisi');" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> calisan_ekle(</span><span style="color: #CE9178">&#39;Ali Veli&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">30</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;Yazılım Mühendisi&#39;</span><span style="color: #D4D4D4">);</span></span></code></pre></div>



<p></p>



<h4 class="wp-block-heading">Veri Manipülasyonu ve Güncelleme</h4>



<p>Veri tabanındaki bir kaydı güncellemek de PL/pgSQL ile kolaydır. Aşağıdaki örnek, bir çalışanın yaşını güncelleyen bir fonksiyon içerir:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PLSQL</span><span role="button" tabindex="0" data-code="CREATE OR REPLACE FUNCTION yas_guncelle(_isim TEXT, _yeni_yas INT) 
RETURNS VOID AS $$
BEGIN
    UPDATE calisanlar 
    SET yas = _yeni_yas 
    WHERE isim = _isim;
END;
$$ LANGUAGE plpgsql;
" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">CREATE OR REPLACE</span><span style="color: #D4D4D4"> FUNCTION yas_guncelle(_isim TEXT, _yeni_yas INT) </span></span>
<span class="line"><span style="color: #D4D4D4">RETURNS VOID </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> $$</span></span>
<span class="line"><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">UPDATE</span><span style="color: #D4D4D4"> calisanlar </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">SET</span><span style="color: #D4D4D4"> yas = _yeni_yas </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">WHERE</span><span style="color: #D4D4D4"> isim = _isim;</span></span>
<span class="line"><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">$$ </span><span style="color: #569CD6">LANGUAGE</span><span style="color: #D4D4D4"> plpgsql;</span></span>
<span class="line"></span></code></pre></div>



<p></p>



<h3 class="wp-block-heading">Kontrol Yapıları (IF, CASE) ve Döngüler</h3>



<h4 class="wp-block-heading">IF Koşulu ile Fonksiyonlar</h4>



<p>Koşullu ifadeler, PL/pgSQL&#8217;in güçlü yönlerinden biridir. Aşağıdaki örnek, bir çalışanın pozisyonuna göre maaşını belirleyen bir fonksiyonu göstermektedir:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PLSQL</span><span role="button" tabindex="0" data-code="CREATE OR REPLACE FUNCTION maas_hesapla(pozisyon TEXT) 
RETURNS NUMERIC AS $$
BEGIN
    IF pozisyon = 'Yazılım Mühendisi' THEN
        RETURN 8000;
    ELSIF pozisyon = 'Proje Yöneticisi' THEN
        RETURN 10000;
    ELSE
        RETURN 6000;
    END IF;
END;
$$ LANGUAGE plpgsql;
" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">CREATE OR REPLACE</span><span style="color: #D4D4D4"> FUNCTION maas_hesapla(pozisyon TEXT) </span></span>
<span class="line"><span style="color: #D4D4D4">RETURNS NUMERIC </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> $$</span></span>
<span class="line"><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">IF</span><span style="color: #D4D4D4"> pozisyon = </span><span style="color: #CE9178">&#39;Yazılım Mühendisi&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">THEN</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">RETURN</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">8000</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">ELSIF</span><span style="color: #D4D4D4"> pozisyon = </span><span style="color: #CE9178">&#39;Proje Yöneticisi&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">THEN</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">RETURN</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">10000</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">ELSE</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">RETURN</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">6000</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">END IF</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">$$ </span><span style="color: #569CD6">LANGUAGE</span><span style="color: #D4D4D4"> plpgsql;</span></span>
<span class="line"></span></code></pre></div>



<p></p>



<p>Fonksiyonu şu şekilde kullanabiliriz;</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PLSQL</span><span role="button" tabindex="0" data-code="SELECT maas_hesapla('Proje Yöneticisi');  -- Çıktı: 10000

-- veya calisanlar tablosunda bir sorguya ekleyebiliriz

SELECT *,maas_hesapla(calisanlar.pozisyon) as &quot;Maaş&quot; FROM calisanlar;

/* Çıktı
  id   isim       yas   pozisyon             Maaş
  1    Ali Veli   30    Yazılım Mühendisi    8000.0
  ..
  ..
*/" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> maas_hesapla(</span><span style="color: #CE9178">&#39;Proje Yöneticisi&#39;</span><span style="color: #D4D4D4">);  </span><span style="color: #6A9955">-- Çıktı: 10000</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">-- veya calisanlar tablosunda bir sorguya ekleyebiliriz</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> *,maas_hesapla(calisanlar.pozisyon) </span><span style="color: #569CD6">as</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;Maaş&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> calisanlar;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">/* Çıktı</span></span>
<span class="line"><span style="color: #6A9955">  id   isim       yas   pozisyon             Maaş</span></span>
<span class="line"><span style="color: #6A9955">  1    Ali Veli   30    Yazılım Mühendisi    8000.0</span></span>
<span class="line"><span style="color: #6A9955">  ..</span></span>
<span class="line"><span style="color: #6A9955">  ..</span></span>
<span class="line"><span style="color: #6A9955">*/</span></span></code></pre></div>



<p></p>



<h4 class="wp-block-heading">CASE İfadesi</h4>



<p>CASE, SQL dilinde olduğu gibi PL/pgSQL içinde de kullanılabilir. Aşağıdaki örnek, CASE ifadesini kullanarak daha temiz bir kodlama sağlar:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PLSQL</span><span role="button" tabindex="0" data-code="CREATE OR REPLACE FUNCTION maas_hesapla_case(pozisyon TEXT) 
RETURNS NUMERIC AS $$
BEGIN
    RETURN CASE 
        WHEN pozisyon = 'Yazılım Mühendisi' THEN 8000
        WHEN pozisyon = 'Proje Yöneticisi' THEN 10000
        ELSE 6000
    END;
END;
$$ LANGUAGE plpgsql;
" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">CREATE OR REPLACE</span><span style="color: #D4D4D4"> FUNCTION maas_hesapla_case(pozisyon TEXT) </span></span>
<span class="line"><span style="color: #D4D4D4">RETURNS NUMERIC </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> $$</span></span>
<span class="line"><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">RETURN</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">CASE</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">WHEN</span><span style="color: #D4D4D4"> pozisyon = </span><span style="color: #CE9178">&#39;Yazılım Mühendisi&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">THEN</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">8000</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">WHEN</span><span style="color: #D4D4D4"> pozisyon = </span><span style="color: #CE9178">&#39;Proje Yöneticisi&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">THEN</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">10000</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">ELSE</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">6000</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">$$ </span><span style="color: #569CD6">LANGUAGE</span><span style="color: #D4D4D4"> plpgsql;</span></span>
<span class="line"></span></code></pre></div>



<p></p>



<h3 class="wp-block-heading">Döngüler ve Tekrarlayan İşlemler</h3>



<p>Döngüler, PL/pgSQL&#8217;de veri tabanı işlemlerini tekrar tekrar gerçekleştirmek için kullanılır. Örneğin, bir tablodaki tüm satırlar üzerinde işlem yapmanız gerekebilir.</p>



<h4 class="wp-block-heading">FOR Döngüsü</h4>



<p>Aşağıda, bir tablodaki tüm çalışanların isimlerini yazdıran bir <code>FOR</code> döngüsü örneği yer alıyor:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PLSQL</span><span role="button" tabindex="0" data-code="CREATE OR REPLACE FUNCTION tum_calisanlari_yazdir() 
RETURNS VOID AS $$
DECLARE
    calisan REFCURSOR;
    satir RECORD;
BEGIN
    OPEN calisan FOR SELECT isim FROM calisanlar;
    
    LOOP
        FETCH calisan INTO satir;
        EXIT WHEN NOT FOUND;
        RAISE NOTICE 'Çalışan: %', satir.isim;
    END LOOP;

    CLOSE calisan;
END;
$$ LANGUAGE plpgsql;
" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">CREATE OR REPLACE</span><span style="color: #D4D4D4"> FUNCTION tum_calisanlari_yazdir() </span></span>
<span class="line"><span style="color: #D4D4D4">RETURNS VOID </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> $$</span></span>
<span class="line"><span style="color: #569CD6">DECLARE</span></span>
<span class="line"><span style="color: #D4D4D4">    calisan REFCURSOR;</span></span>
<span class="line"><span style="color: #D4D4D4">    satir </span><span style="color: #569CD6">RECORD</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">OPEN</span><span style="color: #D4D4D4"> calisan </span><span style="color: #C586C0">FOR</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> isim </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> calisanlar;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">LOOP</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">FETCH</span><span style="color: #D4D4D4"> calisan </span><span style="color: #569CD6">INTO</span><span style="color: #D4D4D4"> satir;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">EXIT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">WHEN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">NOT</span><span style="color: #D4D4D4"> FOUND;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">RAISE</span><span style="color: #D4D4D4"> NOTICE </span><span style="color: #CE9178">&#39;Çalışan: %&#39;</span><span style="color: #D4D4D4">, satir.isim;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">END LOOP</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">CLOSE</span><span style="color: #D4D4D4"> calisan;</span></span>
<span class="line"><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">$$ </span><span style="color: #569CD6">LANGUAGE</span><span style="color: #D4D4D4"> plpgsql;</span></span>
<span class="line"></span></code></pre></div>



<p></p>



<h4 class="wp-block-heading">WHILE Döngüsü</h4>



<p><code>WHILE</code> döngüsü de sıklıkla kullanılır. Örneğin, 1&#8217;den 10&#8217;a kadar sayıları yazdırmak için şöyle bir fonksiyon yazabilirsiniz:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PLSQL</span><span role="button" tabindex="0" data-code="CREATE OR REPLACE FUNCTION sayi_dongusu() 
RETURNS VOID AS $$
DECLARE
    i INT = 1;
BEGIN
    WHILE i &lt;= 10 LOOP
        RAISE NOTICE 'Sayi: %', i;
        i = i + 1;
    END LOOP;
END;
$$ LANGUAGE plpgsql;
" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">CREATE OR REPLACE</span><span style="color: #D4D4D4"> FUNCTION sayi_dongusu() </span></span>
<span class="line"><span style="color: #D4D4D4">RETURNS VOID </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> $$</span></span>
<span class="line"><span style="color: #569CD6">DECLARE</span></span>
<span class="line"><span style="color: #D4D4D4">    i INT = </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">WHILE</span><span style="color: #D4D4D4"> i &lt;= </span><span style="color: #B5CEA8">10</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">LOOP</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">RAISE</span><span style="color: #D4D4D4"> NOTICE </span><span style="color: #CE9178">&#39;Sayi: %&#39;</span><span style="color: #D4D4D4">, i;</span></span>
<span class="line"><span style="color: #D4D4D4">        i = i + </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">END LOOP</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">$$ </span><span style="color: #569CD6">LANGUAGE</span><span style="color: #D4D4D4"> plpgsql;</span></span>
<span class="line"></span></code></pre></div>



<p></p>



<h3 class="wp-block-heading">PL/pgSQL ile Tetikleyiciler (Triggers)</h3>



<p>Tetikleyiciler, veritabanında belirli bir olay meydana geldiğinde (örneğin, bir tabloya veri eklendiğinde) otomatik olarak çalışan özel prosedürlerdir. Tetikleyiciler, veri bütünlüğünü sağlamak ve belirli işlemleri otomatik hale getirmek için kullanılır.</p>



<h4 class="wp-block-heading">Örnek 3: Veri Eklenirken Tetikleyici</h4>



<p>Aşağıdaki örnek, bir <code>calisan_log</code> tablosuna çalışan eklenirken log kaydı tutan bir tetikleyici fonksiyondur:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PLSQL</span><span role="button" tabindex="0" data-code="--calisanlar için bir log tablosu oluşturalım
CREATE TABLE calisan_log (
    id SERIAL PRIMARY KEY,
    calisan_adi TEXT,
    islem_tarihi TIMESTAMP
);

--calışanlar tablosuna ekleme yapıldıüında loglama yapacak fonksiyon, dönül değeri TRIGGER tipinde olmalı
CREATE OR REPLACE FUNCTION log_calisan_ekleme() 
RETURNS TRIGGER AS $$
BEGIN
    INSERT INTO calisan_log (calisan_adi, islem_tarihi)
    VALUES (NEW.isim, NOW());
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

--calisanlar tablomuza kayıt girildikten sonra (after insert) her bir satır için çalışacak (EACH ROW) şekilde fonksiyonumuzu trigger ile bağlıyoruz
CREATE TRIGGER calisan_ekleme_trigger
AFTER INSERT ON calisanlar
FOR EACH ROW EXECUTE FUNCTION log_calisan_ekleme();
" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">--calisanlar için bir log tablosu oluşturalım</span></span>
<span class="line"><span style="color: #569CD6">CREATE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">TABLE</span><span style="color: #D4D4D4"> calisan_log (</span></span>
<span class="line"><span style="color: #D4D4D4">    id SERIAL </span><span style="color: #569CD6">PRIMARY KEY</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    calisan_adi TEXT,</span></span>
<span class="line"><span style="color: #D4D4D4">    islem_tarihi </span><span style="color: #569CD6">TIMESTAMP</span></span>
<span class="line"><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">--calışanlar tablosuna ekleme yapıldıüında loglama yapacak fonksiyon, dönül değeri TRIGGER tipinde olmalı</span></span>
<span class="line"><span style="color: #569CD6">CREATE OR REPLACE</span><span style="color: #D4D4D4"> FUNCTION log_calisan_ekleme() </span></span>
<span class="line"><span style="color: #D4D4D4">RETURNS </span><span style="color: #569CD6">TRIGGER</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> $$</span></span>
<span class="line"><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">INSERT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">INTO</span><span style="color: #D4D4D4"> calisan_log (calisan_adi, islem_tarihi)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">VALUES</span><span style="color: #D4D4D4"> (NEW.isim, NOW());</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">RETURN</span><span style="color: #D4D4D4"> NEW;</span></span>
<span class="line"><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">$$ </span><span style="color: #569CD6">LANGUAGE</span><span style="color: #D4D4D4"> plpgsql;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">--calisanlar tablomuza kayıt girildikten sonra (after insert) her bir satır için çalışacak (EACH ROW) şekilde fonksiyonumuzu trigger ile bağlıyoruz</span></span>
<span class="line"><span style="color: #569CD6">CREATE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">TRIGGER</span><span style="color: #D4D4D4"> calisan_ekleme_trigger</span></span>
<span class="line"><span style="color: #569CD6">AFTER</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">INSERT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">ON</span><span style="color: #D4D4D4"> calisanlar</span></span>
<span class="line"><span style="color: #C586C0">FOR</span><span style="color: #D4D4D4"> EACH </span><span style="color: #569CD6">ROW</span><span style="color: #D4D4D4"> EXECUTE FUNCTION log_calisan_ekleme();</span></span>
<span class="line"></span></code></pre></div>



<p></p>



<h3 class="wp-block-heading">PL/pgSQL ile Hata Yakalama (EXCEPTION)</h3>



<p>PL/pgSQL, veri manipülasyonu sırasında ortaya çıkan hataları yakalamak ve yönetmek için <code>EXCEPTION</code> bloklarını kullanır. Bu, hatalı işlemler durumunda bile programın çalışmaya devam etmesini sağlar.</p>



<p>Aşağıdaki örnekte, sıfıra bölme hatası meydana geldiğinde yakalanan bir fonksiyon yazılmıştır:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PLSQL</span><span role="button" tabindex="0" data-code="CREATE OR REPLACE FUNCTION bolme_islemi(a INT, b INT) RETURNS TEXT AS $$
BEGIN
    RETURN 'Sonuc: ' || (a / b);
EXCEPTION
    WHEN division_by_zero THEN
        RETURN 'Hata: Sıfıra bölme hatası!';
END;
$$ LANGUAGE plpgsql;
" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">CREATE OR REPLACE</span><span style="color: #D4D4D4"> FUNCTION bolme_islemi(a INT, b INT) RETURNS TEXT </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> $$</span></span>
<span class="line"><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">RETURN</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;Sonuc: &#39;</span><span style="color: #D4D4D4"> || (a / b);</span></span>
<span class="line"><span style="color: #569CD6">EXCEPTION</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">WHEN</span><span style="color: #D4D4D4"> division_by_zero </span><span style="color: #569CD6">THEN</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">RETURN</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;Hata: Sıfıra bölme hatası!&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">$$ </span><span style="color: #569CD6">LANGUAGE</span><span style="color: #D4D4D4"> plpgsql;</span></span>
<span class="line"></span></code></pre></div>



<p>Bu fonksiyonu çağırarak sonuçlarını şu şekilde görebilirsiniz:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PLSQL</span><span role="button" tabindex="0" data-code="SELECT bolme_islemi(10, 2);  -- Çıktı: Sonuc: 5
SELECT bolme_islemi(10, 0);  -- Çıktı: Hata: Sıfıra bölme hatası!
" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> bolme_islemi(</span><span style="color: #B5CEA8">10</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">);  </span><span style="color: #6A9955">-- Çıktı: Sonuc: 5</span></span>
<span class="line"><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> bolme_islemi(</span><span style="color: #B5CEA8">10</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">);  </span><span style="color: #6A9955">-- Çıktı: Hata: Sıfıra bölme hatası!</span></span>
<span class="line"></span></code></pre></div>



<p></p>



<h3 class="wp-block-heading">Sonuç</h3>



<p>PL/pgSQL, PostgreSQL veritabanı yönetim sistemini çok daha esnek ve güçlü hale getiren bir prosedürel programlama dilidir. SQL sorguları ile prosedürel dilleri birleştirme yeteneği sayesinde, karmaşık işlemler, hata yönetimi, döngüler ve tetikleyiciler gibi özellikler veritabanı yönetimini optimize eder. PL/pgSQL ile veritabanı işlemleri hem daha verimli hale getirilebilir hem de daha esnek bir yapı sunar.</p>



<p>Geliştiriciler, PL/pgSQL kullanarak veritabanı işlemlerini daha güvenilir ve optimize hale getirerek işletimsel verimliliği artırabilirler. Fonksiyonlar, döngüler, tetikleyiciler ve hata yönetimi ile PL/pgSQL, veritabanı yönetiminde çok yönlü ve güçlü bir araçtır.</p>



<p></p>
<p><a href="https://www.kesifruhu.com/yazilim/veri-tabanlari/pl-pgsql-postgresql-icin-guclu-bir-prosedurel-dil/">PL/pgSQL: PostgreSQL İçin Güçlü Bir Prosedürel Dil</a> yazısı ilk önce <a href="https://www.kesifruhu.com">Keşif Ruhu</a> üzerinde ortaya çıktı.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.kesifruhu.com/yazilim/veri-tabanlari/pl-pgsql-postgresql-icin-guclu-bir-prosedurel-dil/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
