<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Cem GÖKSU</title>
    <description>The latest articles on DEV Community by Cem GÖKSU (@cemgoksu).</description>
    <link>https://dev.to/cemgoksu</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1144715%2F9683d62b-698f-4040-b8c4-300c2fb7d9de.jpeg</url>
      <title>DEV Community: Cem GÖKSU</title>
      <link>https://dev.to/cemgoksu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cemgoksu"/>
    <language>en</language>
    <item>
      <title>🎯PL/SQL’de Bulk Collect ve FORALL nedir? Ne zaman kullanılır?</title>
      <dc:creator>Cem GÖKSU</dc:creator>
      <pubDate>Wed, 26 Feb 2025 22:01:48 +0000</pubDate>
      <link>https://dev.to/cemgoksu/plsqlde-bulk-collect-ve-forall-nedir-ne-zaman-kullanilir-3nce</link>
      <guid>https://dev.to/cemgoksu/plsqlde-bulk-collect-ve-forall-nedir-ne-zaman-kullanilir-3nce</guid>
      <description>&lt;p&gt;PL/SQL’de BULK COLLECT ve FORALL Nedir? Ne Zaman Kullanılır?&lt;/p&gt;

&lt;p&gt;PL/SQL ile büyük veri setleri üzerinde çalışırken, performansı artırmak için BULK COLLECT ve FORALL kullanılabilir. Bu yapılar, satır satır veri işleme yerine toplu veri işlemi yaparak CPU ve I/O maliyetlerini azaltır.&lt;/p&gt;

&lt;p&gt;Bir PL/SQL mülakatında, "BULK COLLECT ve FORALL nedir?, Ne zaman kullanılır?, Performans farkı nedir?" gibi sorularla karşılaşabilirsin.&lt;/p&gt;

&lt;p&gt;Bu makalede, BULK COLLECT ve FORALL’ın ne olduğunu, nasıl çalıştığını ve performansa etkisini inceleyeceğiz.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;BULK COLLECT ve FORALL Nedir?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;📌 BULK COLLECT: Çok sayıda satırı bir koleksiyona (array) toplu olarak çeker.&lt;br&gt;
📌 FORALL: Bir koleksiyon içindeki tüm verileri tek bir DML (INSERT, UPDATE, DELETE) işlemiyle veritabanına gönderir.&lt;/p&gt;

&lt;p&gt;Bu iki yapı, PL/SQL'in satır bazlı işleme yaklaşımını toplu işleme (bulk processing) çevirerek verimliliği artırır.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;BULK COLLECT Kullanımı&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;BULK COLLECT, veri okuma işlemlerinde kullanılır. Tek tek satır okumak yerine, tüm satırları bir koleksiyona (array) toplu olarak yükler.&lt;/p&gt;

&lt;p&gt;📌 Kullanım Adımları:&lt;br&gt;
1️⃣ Koleksiyon Tanımlanır (TYPE ... IS TABLE OF ...)&lt;br&gt;
2️⃣ BULK COLLECT ile SELECT sonucu koleksiyona yüklenir&lt;br&gt;
3️⃣ Daha hızlı işlem yapılır&lt;br&gt;
🔹 BULK COLLECT Kullanımı – Örnek&lt;/p&gt;

&lt;p&gt;&lt;code&gt;DECLARE&lt;br&gt;
    TYPE t_hasta IS TABLE OF hastalar%ROWTYPE;  -- Koleksiyon türü tanımla&lt;br&gt;
    v_hastalar t_hasta;  -- Koleksiyon değişkeni&lt;br&gt;
BEGIN&lt;br&gt;
    -- BULK COLLECT ile toplu veri çekme&lt;br&gt;
    SELECT * BULK COLLECT INTO v_hastalar FROM hastalar;&lt;br&gt;
    -- Koleksiyon içindeki verileri işleme&lt;br&gt;
    FOR i IN 1 .. v_hastalar.COUNT LOOP&lt;br&gt;
        DBMS_OUTPUT.PUT_LINE(v_hastalar(i).ad || ' ' || v_hastalar(i).soyad);&lt;br&gt;
    END LOOP;&lt;br&gt;
END;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;📌 Açıklamalar:&lt;br&gt;
✔ BULK COLLECT INTO → Tüm veriyi koleksiyona yükler.&lt;br&gt;
✔ v_hastalar.COUNT → Kaç satır yüklendiğini gösterir.&lt;br&gt;
✔ Daha hızlı çalışır çünkü tek tek fetch işlemi yapılmaz.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;FORALL Kullanımı&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;FORALL, DML (INSERT, UPDATE, DELETE) işlemlerini hızlandırmak için kullanılır.&lt;br&gt;
Normal FOR LOOP ile her satırda DML işlemi yapmak yerine, tüm koleksiyon tek bir işlem olarak veritabanına gönderilir.&lt;/p&gt;

&lt;p&gt;📌 Kullanım Adımları:&lt;br&gt;
1️⃣ Koleksiyon Tanımlanır&lt;br&gt;
2️⃣ Koleksiyon verileri FORALL ile toplu işlenir&lt;br&gt;
🔹 FORALL Kullanımı – Örnek (Toplu INSERT İşlemi)&lt;/p&gt;

&lt;p&gt;&lt;code&gt;DECLARE&lt;br&gt;
    TYPE t_hasta IS TABLE OF hastalar%ROWTYPE;  &lt;br&gt;
    v_hastalar t_hasta;&lt;br&gt;
BEGIN&lt;br&gt;
    -- BULK COLLECT ile hastaları koleksiyona al&lt;br&gt;
    SELECT * BULK COLLECT INTO v_hastalar FROM hastalar WHERE id &amp;lt; 100;&lt;br&gt;
    -- FORALL ile yeni tabloya toplu ekleme&lt;br&gt;
    FORALL i IN 1 .. v_hastalar.COUNT&lt;br&gt;
        INSERT INTO hastalar_yedek VALUES v_hastalar(i);&lt;br&gt;
    COMMIT;&lt;br&gt;
END;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;📌 Açıklamalar:&lt;br&gt;
✔ FORALL i IN 1 .. v_hastalar.COUNT → DML işlemini toplu yapar.&lt;br&gt;
✔ Her satır için ayrı INSERT çalıştırmaz, tek seferde işler.&lt;br&gt;
✔ Performansı artırır çünkü PL/SQL’den SQL motoruna yapılan geçişleri azaltır.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;BULK COLLECT ve FORALL Performans Karşılaştırması&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fewvafi086wg5o237f7b9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fewvafi086wg5o237f7b9.png" alt="Image description" width="735" height="172"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📢 Neden Daha Hızlı?&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Normal FOR LOOP içinde SELECT yapıldığında, her satır için SQL motoruna gidip geliriz.
BULK COLLECT ile tek seferde veri çekilir.
FORALL ile tek seferde DML işlemi yapılır.
Bu sayede, PL/SQL ve SQL motoru arasındaki bağlatılar azalır ve performans artar. 🚀
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;PL/SQL Mülakatlarında BULK COLLECT ve FORALL ile İlgili Gelebilecek Sorular&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;PL/SQL mülakatlarında BULK COLLECT ve FORALL kullanımı hakkında şu sorularla karşılaşabilirsin:&lt;br&gt;
Soru 1: BULK COLLECT ve FORALL farkı nedir?&lt;/p&gt;

&lt;p&gt;Cevap:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BULK COLLECT, toplu veri okumak için kullanılır.
FORALL, toplu veri yazmak için kullanılır.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Soru 2: BULK COLLECT kullanmanın avantajı nedir?&lt;/p&gt;

&lt;p&gt;Cevap:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Tek tek FETCH yapmak yerine, tüm veriyi bir koleksiyona alır.
PL/SQL ve SQL motoru arasındaki iletişimi azaltarak performansı artırır.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Soru 3: FORALL kullanırken neden FOR LOOP yerine tercih etmeliyiz?&lt;/p&gt;

&lt;p&gt;Cevap:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FOR LOOP içinde DML işlemi her satır için tek tek çalışır.
FORALL ise tüm işlemi SQL motoruna tek seferde gönderir, bu da performansı artırır.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;BULK COLLECT ve FORALL Kullanırken Dikkat Edilmesi Gerekenler&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;📌 BULK COLLECT Kullanırken:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Çok büyük veri setleri bellekte fazla yer kaplayabilir!
Çekilecek veri miktarına göre LIMIT kullanabilirsin.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;FETCH cursor_adı BULK COLLECT INTO koleksiyon_name LIMIT 1000;&lt;/p&gt;

&lt;p&gt;📌 FORALL Kullanırken:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sıralı bir koleksiyon kullanılmalıdır.
Eğer bir hata olursa, tüm işlemler iptal olur.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;code&gt;FORALL i IN 1 .. v_hastalar.COUNT SAVE EXCEPTIONS&lt;br&gt;
    INSERT INTO hastalar_yedek VALUES v_hastalar(i);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;📢 SAVE EXCEPTIONS kullanarak hataları yakalayabilirsin!&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sonuç&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;🎯 Özetle:&lt;br&gt;
✅ BULK COLLECT, toplu veri okumak için kullanılır.&lt;br&gt;
✅ FORALL, toplu veri yazmak için kullanılır.&lt;br&gt;
✅ PL/SQL ve SQL motoru arasındaki gereksiz işlemleri azaltarak performansı artırır.&lt;/p&gt;

</description>
      <category>plsql</category>
      <category>oracle</category>
    </item>
    <item>
      <title>PL/SQL’de Cursor nasıl kullanılır? Cursor WITH HOLD ve WITHOUT HOLD nedir? PL/SQL’de REF CURSOR Nedir?</title>
      <dc:creator>Cem GÖKSU</dc:creator>
      <pubDate>Wed, 26 Feb 2025 21:59:13 +0000</pubDate>
      <link>https://dev.to/cemgoksu/plsqlde-cursor-nasil-kullanilir-cursor-with-hold-ve-without-hold-nedir-plsqlde-ref-cursor-4lnc</link>
      <guid>https://dev.to/cemgoksu/plsqlde-cursor-nasil-kullanilir-cursor-with-hold-ve-without-hold-nedir-plsqlde-ref-cursor-4lnc</guid>
      <description>&lt;p&gt;PL/SQL’de Cursor Kullanımı ve REF CURSOR Kavramı&lt;/p&gt;

&lt;p&gt;PL/SQL’de Cursor (İmleç), çok satırlı verileri satır satır işlemek için kullanılan bir mekanizmadır. Özellikle büyük veri setleriyle çalışırken, verimli veri işleme ve yönetimi için kullanılır.&lt;/p&gt;

&lt;p&gt;Bir PL/SQL mülakatında, "Cursor nedir?, Ne zaman kullanılır?, Explicit Cursor ve Implicit Cursor arasındaki fark nedir?, REF CURSOR nedir?" gibi sorularla karşılaşabilirsin.&lt;/p&gt;

&lt;p&gt;Bu makalede, Cursor kullanımı, türleri, REF CURSOR yapısı ve WITH HOLD - WITHOUT HOLD farklarını detaylıca ele alacağız.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;PL/SQL’de Cursor Nedir?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Cursor (İmleç), bir SELECT sorgusunun sonuç kümesini bellekte saklayan ve satır satır işlemeye olanak sağlayan bir PL/SQL nesnesidir.&lt;/p&gt;

&lt;p&gt;📢 Neden Kullanılır?&lt;br&gt;
✔ Çok satırlı sorguları yönetmek için&lt;br&gt;
✔ Satır satır veri işlemek için&lt;br&gt;
✔ Daha kontrollü veri erişimi sağlamak için&lt;/p&gt;

&lt;p&gt;PL/SQL'de Implicit (Gizli) ve Explicit (Açık) Cursor olmak üzere iki ana tür vardır.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Implicit Cursor (Gizli İmleç) Kullanımı&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Oracle, tek bir satır döndüren sorgular için Implicit Cursor oluşturur ve otomatik olarak yönetir.&lt;/p&gt;

&lt;p&gt;📌 Örnek Kullanım&lt;/p&gt;

&lt;p&gt;&lt;code&gt;DECLARE&lt;br&gt;
    v_hasta_adi VARCHAR2(50);&lt;br&gt;
BEGIN&lt;br&gt;
    SELECT ad INTO v_hasta_adi FROM hastalar WHERE id = 101;&lt;br&gt;
    DBMS_OUTPUT.PUT_LINE('Hasta Adı: ' || v_hasta_adi);&lt;br&gt;
END;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;📌 Dikkat:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT INTO tek bir satır döndürmelidir.
Eğer hiç satır dönmezse NO_DATA_FOUND hatası alırsın.
Eğer birden fazla satır dönerse TOO_MANY_ROWS hatası alırsın.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Explicit Cursor (Açık İmleç) Kullanımı&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Explicit Cursor, geliştirici tarafından manuel olarak tanımlanır ve yönetilir.&lt;/p&gt;

&lt;p&gt;📌 Explicit Cursor Kullanım Adımları:&lt;br&gt;
1️⃣ Tanımlama: CURSOR cursor_adı IS &lt;br&gt;
2️⃣ Açma: OPEN cursor_adı;&lt;br&gt;
3️⃣ Okuma (Fetch): FETCH cursor_adı INTO değişkenler;&lt;br&gt;
4️⃣ Kapatma: CLOSE cursor_adı;&lt;/p&gt;

&lt;p&gt;📌 Örnek Kullanım:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;DECLARE&lt;br&gt;
    CURSOR hasta_cursor IS&lt;br&gt;
        SELECT id, ad, soyad FROM hastalar;&lt;br&gt;
    v_id    NUMBER;&lt;br&gt;
    v_ad    VARCHAR2(50);&lt;br&gt;
    v_soyad VARCHAR2(50);&lt;br&gt;
BEGIN&lt;br&gt;
    OPEN hasta_cursor;&lt;br&gt;
    LOOP&lt;br&gt;
        FETCH hasta_cursor INTO v_id, v_ad, v_soyad;&lt;br&gt;
        EXIT WHEN hasta_cursor%NOTFOUND; &lt;br&gt;
        DBMS_OUTPUT.PUT_LINE('Hasta: ' || v_id || ' - ' || v_ad || ' ' || v_soyad);&lt;br&gt;
    END LOOP;&lt;br&gt;
    CLOSE hasta_cursor;&lt;br&gt;
END;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;📌 Açıklamalar:&lt;br&gt;
✔ OPEN → Cursor’ı açar ve belleğe yükler.&lt;br&gt;
✔ FETCH → Bir satır okur ve değişkenlere atar.&lt;br&gt;
✔ EXIT WHEN cursor_adı%NOTFOUND; → Tüm satırlar okunduğunda döngüyü sonlandırır.&lt;br&gt;
✔ CLOSE → Cursor’ı kapatır ve belleği boşaltır.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Cursor WITH HOLD ve WITHOUT HOLD Nedir?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Oracle PL/SQL'de Cursor'lar varsayılan olarak WITHOUT HOLD olarak çalışır.&lt;/p&gt;

&lt;p&gt;📢 WITH HOLD ve WITHOUT HOLD Farkı:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WITH HOLD: Cursor, transaction (işlem) sonlandıktan sonra da açık kalır.
WITHOUT HOLD: Cursor, transaction commit veya rollback yapıldığında kapanır.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Oracle PL/SQL, WITH HOLD desteği vermez ama PostgreSQL, MySQL gibi veritabanlarında desteklenir.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;DECLARE&lt;br&gt;
    CURSOR hasta_cursor IS&lt;br&gt;
        SELECT id, ad FROM hastalar;&lt;br&gt;
BEGIN&lt;br&gt;
    OPEN hasta_cursor; -- Transaction bitince kapanır (WITHOUT HOLD)&lt;br&gt;
END;&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;PL/SQL’de REF CURSOR Nedir? (Dinamik Cursor Kullanımı)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;REF CURSOR, dinamik olarak tanımlanabilen ve herhangi bir sorguya bağlanabilen esnek bir Cursor türüdür.&lt;/p&gt;

&lt;p&gt;📌 REF CURSOR Kullanım Senaryosu:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Eğer dinamik SQL kullanıyorsan (örneğin farklı tablolardan veri çekiyorsan), REF CURSOR kullanabilirsin.
Stored Procedure’lerde sonuç kümesini dışarı aktarmak için REF CURSOR idealdir.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;📌 REF CURSOR Kullanım Adımları:&lt;br&gt;
1️⃣ REF CURSOR tanımlanır&lt;br&gt;
2️⃣ Dinamik SQL atanır ve açılır&lt;br&gt;
3️⃣ Sonuç kümesi işlenir&lt;/p&gt;

&lt;p&gt;📌 Örnek REF CURSOR Kullanımı&lt;/p&gt;

&lt;p&gt;&lt;code&gt;DECLARE&lt;br&gt;
    TYPE hasta_ref_cursor IS REF CURSOR;&lt;br&gt;
    v_hasta_cursor hasta_ref_cursor;&lt;br&gt;
    v_id    NUMBER;&lt;br&gt;
    v_ad    VARCHAR2(50);&lt;br&gt;
BEGIN&lt;br&gt;
    OPEN v_hasta_cursor FOR SELECT id, ad FROM hastalar;&lt;br&gt;
    LOOP&lt;br&gt;
        FETCH v_hasta_cursor INTO v_id, v_ad;&lt;br&gt;
        EXIT WHEN v_hasta_cursor%NOTFOUND;&lt;br&gt;
        DBMS_OUTPUT.PUT_LINE('Hasta: ' || v_id || ' - ' || v_ad);&lt;br&gt;
    END LOOP;&lt;br&gt;
    CLOSE v_hasta_cursor;&lt;br&gt;
END;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;📌 Açıklamalar:&lt;br&gt;
✔ REF CURSOR, farklı sorgulara atanabilir.&lt;br&gt;
✔ Stored Procedure ile döndürülebilir (Örn: API entegrasyonları için).&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;PL/SQL Mülakatlarında Cursor ile İlgili Gelebilecek Sorular&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;PL/SQL mülakatlarında Cursor kullanımı ile ilgili şu sorular karşına çıkabilir:&lt;br&gt;
Soru 1: Implicit ve Explicit Cursor farkı nedir?&lt;/p&gt;

&lt;p&gt;Cevap:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Implicit Cursor: Oracle tarafından otomatik oluşturulur (SELECT INTO).
Explicit Cursor: Kullanıcı tarafından manuel tanımlanır (CURSOR ... IS SELECT ...).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Soru 2: REF CURSOR nedir? Ne zaman kullanılır?&lt;/p&gt;

&lt;p&gt;Cevap:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;REF CURSOR, dinamik cursor’dır, farklı sorgulara bağlanabilir.
Stored Procedure ile sonuç kümesi döndürmek için kullanılır.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Soru 3: Cursor WITH HOLD ve WITHOUT HOLD farkı nedir?&lt;/p&gt;

&lt;p&gt;Cevap:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WITH HOLD: Transaction sonrası cursor açık kalır.
WITHOUT HOLD: Transaction commit/rollback sonrası cursor kapanır (Oracle varsayılanı).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Sonuç&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;PL/SQL’de Cursor, çok satırlı verileri işlemek için kullanılan bir mekanizmadır. REF CURSOR ise dinamik ve esnek bir yapıdır.&lt;/p&gt;

&lt;p&gt;🎯 Özetle:&lt;br&gt;
✅ Cursor, çok satırlı verileri yönetmek için kullanılır.&lt;br&gt;
✅ Explicit Cursor, manuel yönetilen Cursor’dır.&lt;br&gt;
✅ REF CURSOR, dinamik veri yönetimi sağlar.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🎯 PL/SQL’de Exception Handling (Hata Yönetimi)</title>
      <dc:creator>Cem GÖKSU</dc:creator>
      <pubDate>Wed, 26 Feb 2025 21:56:15 +0000</pubDate>
      <link>https://dev.to/cemgoksu/plsqlde-exception-handling-hata-yonetimi-cj2</link>
      <guid>https://dev.to/cemgoksu/plsqlde-exception-handling-hata-yonetimi-cj2</guid>
      <description>&lt;p&gt;PL/SQL’de Exception Handling (Hata Yönetimi)&lt;/p&gt;

&lt;p&gt;PL/SQL geliştirirken, beklenmeyen hatalarla (exceptions) karşılaşmak kaçınılmazdır. Ancak doğru hata yönetimi, uygulamanın stabil, güvenilir ve hata toleranslı olmasını sağlar.&lt;/p&gt;

&lt;p&gt;Bir PL/SQL mülakatında, "PL/SQL’de Exception Handling nasıl yapılır?", "User-Defined Exception (Kullanıcı Tanımlı Hata) nasıl oluşturulur?" veya "EXCEPTION blokları nasıl çalışır?" gibi sorularla karşılaşabilirsin.&lt;/p&gt;

&lt;p&gt;Bu makalede, PL/SQL’de hata yönetimi (Exception Handling) kavramını, türlerini ve en iyi uygulama yöntemlerini inceleyeceğiz.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;PL/SQL’de Exception Handling Nedir?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;📌 Exception Handling (Hata Yönetimi), çalışma zamanı hatalarını yakalayıp programın çökmesini önlemek için kullanılır.&lt;/p&gt;

&lt;p&gt;📢 Neden Kullanılır?&lt;br&gt;
✔ Programın beklenmedik bir hata yüzünden durmasını engeller.&lt;br&gt;
✔ Kullanıcıya daha açıklayıcı hata mesajları sunar.&lt;br&gt;
✔ Uygulamanın güvenilirliğini artırır.&lt;/p&gt;

&lt;p&gt;PL/SQL’de hata yakalama işlemi EXCEPTION bloğu kullanılarak yapılır.&lt;/p&gt;

&lt;p&gt;📌 Temel Exception Yapısı&lt;/p&gt;

&lt;p&gt;&lt;code&gt;BEGIN&lt;br&gt;
    -- Ana kod bloğu&lt;br&gt;
EXCEPTION&lt;br&gt;
    WHEN &amp;lt;HATA_TIPI&amp;gt; THEN&lt;br&gt;
        -- Hata yönetimi&lt;br&gt;
END;&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;PL/SQL Exception Türleri&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;PL/SQL’de üç ana Exception türü bulunur:&lt;br&gt;
1️⃣ Predefined Exceptions (Ön Tanımlı Hatalar)&lt;/p&gt;

&lt;p&gt;Oracle tarafından tanımlanmış, sık karşılaşılan standart hata türleridir.&lt;/p&gt;

&lt;p&gt;🔹 Örnekler:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbjt5jcv2amar1c89f6ku.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbjt5jcv2amar1c89f6ku.png" alt="Image description" width="667" height="172"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📌 Kullanımı:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;BEGIN&lt;br&gt;
    SELECT ad INTO v_ad FROM hastalar WHERE id = 99999;  -- Bu ID yoksa hata verir&lt;br&gt;
EXCEPTION&lt;br&gt;
    WHEN NO_DATA_FOUND THEN&lt;br&gt;
        DBMS_OUTPUT.PUT_LINE('Kayıt bulunamadı.');&lt;br&gt;
    WHEN TOO_MANY_ROWS THEN&lt;br&gt;
        DBMS_OUTPUT.PUT_LINE('Birden fazla kayıt döndü.');&lt;br&gt;
END;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;2️⃣ User-Defined Exceptions (Kullanıcı Tanımlı Hatalar)&lt;/p&gt;

&lt;p&gt;Özel hata senaryoları için kendi Exception’larımızı tanımlayabiliriz.&lt;/p&gt;

&lt;p&gt;📌 Kullanımı:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;DECLARE&lt;br&gt;
    hasta_yok EXCEPTION;  -- Kullanıcı tanımlı hata&lt;br&gt;
    PRAGMA EXCEPTION_INIT(hasta_yok, -20001);  -- Özel hata kodu atama&lt;br&gt;
BEGIN&lt;br&gt;
    IF NOT EXISTS (SELECT 1 FROM hastalar WHERE id = 101) THEN&lt;br&gt;
        RAISE hasta_yok;  -- Hata fırlat&lt;br&gt;
    END IF;&lt;br&gt;
EXCEPTION&lt;br&gt;
    WHEN hasta_yok THEN&lt;br&gt;
        DBMS_OUTPUT.PUT_LINE('Özel hata: Hasta bulunamadı.');&lt;br&gt;
END;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Önemli Nokta:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RAISE &amp;lt;HATA_ADI&amp;gt; komutu ile hata fırlatılabilir.
PRAGMA EXCEPTION_INIT ile Oracle hata kodlarına özel hata tanımlanabilir.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;3️⃣ Named System Exceptions (İsimlendirilmiş Oracle Hataları)&lt;/p&gt;

&lt;p&gt;Oracle’ın belirli hata kodlarını isimlendirmek için kullanılır.&lt;/p&gt;

&lt;p&gt;📌 Kullanımı:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;DECLARE&lt;br&gt;
    duplicate_entry EXCEPTION;&lt;br&gt;
    PRAGMA EXCEPTION_INIT(duplicate_entry, -00001);  -- ORA-00001 = Unique Constraint Hatası&lt;br&gt;
BEGIN&lt;br&gt;
    INSERT INTO hastalar(id, ad) VALUES (1, 'Ali');  -- Eğer ID 1 zaten varsa hata verecek&lt;br&gt;
EXCEPTION&lt;br&gt;
    WHEN duplicate_entry THEN&lt;br&gt;
        DBMS_OUTPUT.PUT_LINE('Tekrarlanan veri hatası!');&lt;br&gt;
END;&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;EXCEPTION Kullanımı ve Örnek Senaryolar
📌 Temel Exception Kullanımı&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;BEGIN&lt;br&gt;
    INSERT INTO hastalar(id, ad) VALUES (101, 'Ali');&lt;br&gt;
EXCEPTION&lt;br&gt;
    WHEN OTHERS THEN  -- Tüm hataları yakalar&lt;br&gt;
        DBMS_OUTPUT.PUT_LINE('Bir hata oluştu: ' || SQLERRM);&lt;br&gt;
END;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;📢 SQLERRM, hata mesajını döndürür.&lt;br&gt;
📌 Birden Fazla Exception Kullanımı&lt;/p&gt;

&lt;p&gt;&lt;code&gt;BEGIN&lt;br&gt;
    UPDATE hastalar SET ad = 'Mehmet' WHERE id = 500;  -- Eğer 500 ID yoksa hata&lt;br&gt;
EXCEPTION&lt;br&gt;
    WHEN NO_DATA_FOUND THEN&lt;br&gt;
        DBMS_OUTPUT.PUT_LINE('Hata: Kayıt bulunamadı.');&lt;br&gt;
    WHEN TOO_MANY_ROWS THEN&lt;br&gt;
        DBMS_OUTPUT.PUT_LINE('Hata: Birden fazla kayıt döndü.');&lt;br&gt;
    WHEN OTHERS THEN&lt;br&gt;
        DBMS_OUTPUT.PUT_LINE('Bilinmeyen bir hata oluştu.');&lt;br&gt;
END;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;📌 RAISE ile Hata Fırlatma&lt;/p&gt;

&lt;p&gt;📌 Eğer belirli bir hata durumunda özel bir hata fırlatmak istiyorsan RAISE komutunu kullanabilirsin.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;DECLARE&lt;br&gt;
    hasta_bulunamadi EXCEPTION;&lt;br&gt;
BEGIN&lt;br&gt;
    SELECT ad INTO v_ad FROM hastalar WHERE id = 99999;&lt;br&gt;
    IF v_ad IS NULL THEN&lt;br&gt;
        RAISE hasta_bulunamadi;&lt;br&gt;
    END IF;&lt;br&gt;
EXCEPTION&lt;br&gt;
    WHEN hasta_bulunamadi THEN&lt;br&gt;
        DBMS_OUTPUT.PUT_LINE('Hasta bulunamadı!');&lt;br&gt;
END;&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;PL/SQL Exception Handling ile İlgili Gelebilecek Sorular&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;PL/SQL Exception Handling ile ilgili şu sorular karşına çıkabilir:&lt;br&gt;
Soru 1: Predefined ve User-Defined Exception farkı nedir?&lt;/p&gt;

&lt;p&gt;Cevap:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Predefined Exception: Oracle tarafından tanımlanmış hata türleri (NO_DATA_FOUND, ZERO_DIVIDE).
User-Defined Exception: Geliştirici tarafından tanımlanan özel hata türleri.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Soru 2: OTHERS Exception ne yapar? Kullanımı önerilir mi?&lt;/p&gt;

&lt;p&gt;Cevap:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WHEN OTHERS tüm hata türlerini yakalar, ancak spesifik hata yönetimi önerilir.
Güvenlik ve hata ayıklama açısından, belirli hata türleri için ayrı WHEN blokları kullanmak daha iyidir.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Soru 3: Bir PL/SQL bloğunda nasıl özel hata oluşturabiliriz?&lt;/p&gt;

&lt;p&gt;Cevap:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DECLARE my_exception EXCEPTION;
RAISE my_exception;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Sonuç&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;PL/SQL’de Exception Handling, hataları yöneterek uygulamanın güvenilirliğini ve dayanıklılığını artırır.&lt;/p&gt;

&lt;p&gt;🎯 Özetle:&lt;br&gt;
✅ EXCEPTION bloğu ile hatalar yakalanır.&lt;br&gt;
✅ Predefined ve User-Defined Exception türleri vardır.&lt;br&gt;
✅ RAISE ile özel hatalar oluşturulabilir.&lt;br&gt;
✅ WHEN OTHERS tüm hataları yakalar, ama dikkatli kullanılmalıdır.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>📦PL/SQL’de paket (Package) nedir? İçeriğinde neler bulunur?</title>
      <dc:creator>Cem GÖKSU</dc:creator>
      <pubDate>Wed, 26 Feb 2025 21:52:29 +0000</pubDate>
      <link>https://dev.to/cemgoksu/plsqlde-paket-package-nedir-iceriginde-neler-bulunur-1d81</link>
      <guid>https://dev.to/cemgoksu/plsqlde-paket-package-nedir-iceriginde-neler-bulunur-1d81</guid>
      <description>&lt;p&gt;PL/SQL’de Paket (Package) Nedir? İçeriğinde Neler Bulunur?&lt;/p&gt;

&lt;p&gt;Oracle PL/SQL'de Package (Paket), ilgili prosedürleri, fonksiyonları, değişkenleri ve diğer bileşenleri tek bir modülde gruplayarak yönetmeyi sağlayan güçlü bir yapıdır. Büyük ve kompleks PL/SQL projelerinde kod organizasyonunu ve performansı artırır.&lt;/p&gt;

&lt;p&gt;PL/SQL mülakatlarında "Package kullanımı hakkında bilgin var mı?" veya "Stored Procedure mü, Package mi kullanmalıyız?" gibi sorular karşına çıkabilir. Bu makalede PL/SQL'de Paket'in ne olduğunu, içeriğinde neler bulunduğunu ve neden önemli olduğunu detaylıca ele alacağız.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;PL/SQL'de Package (Paket) Nedir?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;📌 Package, birbiriyle ilişkili Stored Procedure, Function, Cursor, Değişken ve Exception tanımlarını tek bir çatı altında toplayan PL/SQL nesnesidir.&lt;/p&gt;

&lt;p&gt;📢 Neden Kullanılır?&lt;br&gt;
✔ Kodun yeniden kullanılabilirliğini artırır&lt;br&gt;
✔ Kod organizasyonunu sağlar&lt;br&gt;
✔ Performansı artırır (Önceden derlenmiş kod)&lt;br&gt;
✔ Güvenlik ve gizliliği artırır (Özel ve genel bileşenler)&lt;/p&gt;

&lt;p&gt;📢 Package ile Stored Procedure arasındaki fark:&lt;br&gt;
Stored Procedure’ler bağımsızdır ve her seferinde yüklenir. Package'ler ise bellekte saklanır ve daha hızlı çalışır.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;PL/SQL Package İçeriğinde Neler Bulunur?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;PL/SQL package’ler iki ana bileşenden oluşur:&lt;br&gt;
1️⃣ Package Specification (Tanımlama Kısmı)&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Dışarıdan erişilebilecek prosedürleri, fonksiyonları, değişkenleri ve cursor’ları tanımlar.
Ne yapılacağını belirtir, ama nasıl yapılacağını içermez.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;2️⃣ Package Body (Gövde Kısmı)&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Tanımlanan prosedür ve fonksiyonların içeriklerini (iş mantığını) barındırır.
Özel (private) alt programlar oluşturulabilir (sadece package içinde kullanılabilir).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;📌 Package Specification ve Body bağımsız olarak derlenebilir.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;PL/SQL Package Örnek Kullanımı&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Bir hasta yönetim sisteminde, hastaların bilgilerini yönetmek için bir HASTA_PKG paketi oluşturalım.&lt;br&gt;
🔹 Package Specification (Tanımlama Kısmı)&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CREATE OR REPLACE PACKAGE HASTA_PKG AS&lt;br&gt;
    -- Global değişken&lt;br&gt;
    hasta_sayisi NUMBER := 0;&lt;br&gt;
    -- Prosedür tanımları&lt;br&gt;
    PROCEDURE hasta_ekle(p_id IN NUMBER, p_ad IN VARCHAR2, p_soyad IN VARCHAR2);&lt;br&gt;
    -- Fonksiyon tanımları&lt;br&gt;
    FUNCTION hasta_sayisini_al RETURN NUMBER;&lt;br&gt;
END HASTA_PKG;&lt;br&gt;
/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;📌 Ne Yapıyor?&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;hasta_ekle prosedürü hasta ekleme işlemini yapacak.
hasta_sayisini_al fonksiyonu toplam hasta sayısını döndürecek.
Global değişken olan hasta_sayisi, paketin içinde takip edilecek.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;🔹 Package Body (Gövde Kısmı)&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CREATE OR REPLACE PACKAGE BODY HASTA_PKG AS&lt;br&gt;
    -- Hasta ekleyen prosedür&lt;br&gt;
    PROCEDURE hasta_ekle(p_id IN NUMBER, p_ad IN VARCHAR2, p_soyad IN VARCHAR2) AS&lt;br&gt;
    BEGIN&lt;br&gt;
        INSERT INTO hastalar (id, ad, soyad) VALUES (p_id, p_ad, p_soyad);&lt;br&gt;
        COMMIT;&lt;br&gt;
        hasta_sayisi := hasta_sayisi + 1;&lt;br&gt;
    END hasta_ekle;&lt;br&gt;
    -- Hasta sayısını döndüren fonksiyon&lt;br&gt;
    FUNCTION hasta_sayisini_al RETURN NUMBER AS&lt;br&gt;
    BEGIN&lt;br&gt;
        RETURN hasta_sayisi;&lt;br&gt;
    END hasta_sayisini_al;&lt;br&gt;
END HASTA_PKG;&lt;br&gt;
/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;📌 Ne Yapıyor?&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;hasta_ekle prosedürü bir hasta eklediğinde, hasta_sayisi değişkenini artırıyor.
hasta_sayisini_al fonksiyonu, toplam hasta sayısını döndürüyor.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;PL/SQL Package Nasıl Kullanılır?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Package içindeki prosedür ve fonksiyonları çağırmak için:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;EXEC HASTA_PKG.hasta_ekle(101, 'Ali', 'Demir');&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Function çağırmak için:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;SELECT HASTA_PKG.hasta_sayisini_al FROM dual;&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;PL/SQL Package Kullanımının Avantajları&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;📌 ✅ Performans Artışı:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Package içindeki tüm bileşenler ilk çağrıldığında belleğe yüklenir, böylece sonraki çağrılarda daha hızlı çalışır.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;📌 ✅ Kod Organizasyonu:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;İlgili prosedür ve fonksiyonları tek bir modülde toplar.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;📌 ✅ Güvenlik ve Encapsulation:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Özel (private) prosedür ve fonksiyonlar yalnızca package içinde kullanılabilir.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;📌 ✅ Bağımsız Geliştirme:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Package Specification değişmeden, Body güncellenebilir, böylece bağlı nesneler etkilenmez.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;PL/SQL Package ile İlgili Gelebilecek Sorular&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;PL/SQL Package kullanımı hakkında şu sorular karşına çıkabilir:&lt;br&gt;
Soru 1: Package ve Stored Procedure arasındaki fark nedir?&lt;/p&gt;

&lt;p&gt;Cevap:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Stored Procedure bağımsız çalışır, her çağrıldığında yeniden yüklenir.
Package bellekte saklanır, performans avantajı sunar.
Package içinde birden fazla prosedür ve fonksiyon saklanabilir.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Soru 2: Package içindeki bir fonksiyon özel olabilir mi?&lt;/p&gt;

&lt;p&gt;Cevap:&lt;br&gt;
Evet, Package Body içinde tanımlanan fonksiyonlar özel (private) olabilir. Package Specification içinde belirtilmezse, dışarıdan çağrılamaz.&lt;br&gt;
Soru 3: Bir Package’in sadece Body kısmını güncelleyebilir miyiz?&lt;/p&gt;

&lt;p&gt;Cevap:&lt;br&gt;
Evet! Package Specification değişmeden, sadece Body güncellenebilir. Bu sayede bağlı nesneleri etkilemeden geliştirme yapabiliriz.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sonuç&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;PL/SQL'de Package, ilgili prosedür, fonksiyon ve değişkenleri tek bir çatı altında toplamak için kullanılan güçlü bir araçtır. Kod organizasyonu sağlar, performansı artırır ve güvenliği artırır.&lt;/p&gt;

&lt;p&gt;🎯 Özetle:&lt;br&gt;
✅ Package, ilgili PL/SQL nesnelerini gruplar.&lt;br&gt;
✅ Daha hızlı çalışır çünkü bellekte saklanır.&lt;br&gt;
✅ Güvenlik sağlar, özel bileşenler oluşturulabilir.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🎯Stored Procedure ve Function arasındaki fark nedir?</title>
      <dc:creator>Cem GÖKSU</dc:creator>
      <pubDate>Wed, 26 Feb 2025 21:47:57 +0000</pubDate>
      <link>https://dev.to/cemgoksu/stored-procedure-ve-function-arasindaki-fark-nedir-2o8a</link>
      <guid>https://dev.to/cemgoksu/stored-procedure-ve-function-arasindaki-fark-nedir-2o8a</guid>
      <description>&lt;p&gt;Stored Procedure ve Function Arasındaki Fark Nedir?&lt;/p&gt;

&lt;p&gt;Veritabanı geliştirme süreçlerinde, Stored Procedure (Saklı Yordam) ve Function (Fonksiyon) en çok kullanılan iki programlama yapısıdır. Ancak, bu iki yapı arasındaki farklar, kullanım alanları ve performans avantajları birçok PL/SQL mülakatında sorulabilecek kritik konular arasındadır.&lt;/p&gt;

&lt;p&gt;Bu makalede, Stored Procedure ve Function arasındaki temel farkları, kullanım alanlarını ve mülakatlarda karşına çıkabilecek önemli noktaları ele alacağız.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Stored Procedure Nedir?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Stored Procedure, tekrar tekrar çalıştırılabilen, içinde SQL ifadeleri ve PL/SQL kodları barındıran bir kod bloğudur. DML (INSERT, UPDATE, DELETE) işlemleri dahil olmak üzere kompleks işlemleri barındırabilir.&lt;/p&gt;

&lt;p&gt;📌 Stored Procedure’un Özellikleri:&lt;br&gt;
✔ Parametre alabilir (IN, OUT, INOUT)&lt;br&gt;
✔ Birden fazla değeri döndürebilir&lt;br&gt;
✔ DML işlemleri (INSERT, UPDATE, DELETE) gerçekleştirebilir&lt;br&gt;
✔ Exception Handling (Hata Yönetimi) yapılabilir&lt;br&gt;
✔ Performansı artırmak için önceden derlenmiş olarak saklanır&lt;br&gt;
Stored Procedure Örnek Kullanımı&lt;br&gt;
&lt;code&gt;&lt;br&gt;
CREATE OR REPLACE PROCEDURE hasta_ekle(&lt;br&gt;
    p_hasta_id IN NUMBER,&lt;br&gt;
    p_ad IN VARCHAR2,&lt;br&gt;
    p_soyad IN VARCHAR2&lt;br&gt;
)&lt;br&gt;
IS&lt;br&gt;
BEGIN&lt;br&gt;
    INSERT INTO hastalar (id, ad, soyad)&lt;br&gt;
    VALUES (p_hasta_id, p_ad, p_soyad);&lt;br&gt;
    COMMIT;&lt;br&gt;
END hasta_ekle;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Bu prosedür, hasta bilgilerini hastalar tablosuna ekler. Bir stored procedure çağırmak için:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;EXEC hasta_ekle(101, 'Ali', 'Demir');&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Function Nedir?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Function, belirli bir girdiyi alıp bir çıktı döndüren bir kod bloğudur. Özellikle hesaplama işlemlerinde, dönüş değeri gerektiren durumlarda kullanılır.&lt;/p&gt;

&lt;p&gt;📌 Function’ın Özellikleri:&lt;br&gt;
✔ Mutlaka bir değer döndürmelidir&lt;br&gt;
✔ İçinde SQL işlemleri yapılabilir ama DML işlemleri önerilmez&lt;br&gt;
✔ Stored Procedure’lere kıyasla daha fazla performans optimizasyonu yapılabilir&lt;br&gt;
✔ SELECT ifadelerinde kullanılabilir&lt;br&gt;
Function Örnek Kullanımı&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CREATE OR REPLACE FUNCTION hasta_yasi_hesapla(p_dogum_tarihi IN DATE)&lt;br&gt;
RETURN NUMBER&lt;br&gt;
IS&lt;br&gt;
    v_yas NUMBER;&lt;br&gt;
BEGIN&lt;br&gt;
    v_yas := FLOOR(MONTHS_BETWEEN(SYSDATE, p_dogum_tarihi) / 12);&lt;br&gt;
    RETURN v_yas;&lt;br&gt;
END hasta_yasi_hesapla;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Bu fonksiyon, bir hastanın doğum tarihini alıp yaşını döndürür. Çağırmak için:&lt;/p&gt;

&lt;p&gt;SELECT hasta_yasi_hesapla(DATE '1990-05-10') FROM dual;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Stored Procedure ve Function Arasındaki Farklar&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyw3tiv40qoi48j5d6y87.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyw3tiv40qoi48j5d6y87.png" alt="Image description" width="769" height="331"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;PL/SQL Mülakatlarında Stored Procedure ve Function ile İlgili Gelebilecek Sorular&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;PL/SQL mülakatında, Stored Procedure ve Function ile ilgili şu tarz sorularla karşılaşabilirsin:&lt;br&gt;
Soru 1: Stored Procedure ve Function arasındaki fark nedir?&lt;/p&gt;

&lt;p&gt;Bu soruya yukarıdaki tabloyu referans göstererek yanıt verebilirsin.&lt;br&gt;
Soru 2: Bir Function içinden DML işlemi çağırabilir miyiz?&lt;/p&gt;

&lt;p&gt;Evet, çağırabiliriz ama bu önerilmez. Çünkü Function’lar genellikle deterministik çalışmalıdır (aynı girdiye her zaman aynı çıktıyı vermelidir).&lt;/p&gt;

&lt;p&gt;Örneğin, aşağıdaki Function geçerli ama iyi bir uygulama değildir:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CREATE OR REPLACE FUNCTION hasta_ekle_fonksiyon(p_hasta_id IN NUMBER, p_ad IN VARCHAR2, p_soyad IN VARCHAR2)&lt;br&gt;
RETURN VARCHAR2&lt;br&gt;
IS&lt;br&gt;
BEGIN&lt;br&gt;
    INSERT INTO hastalar (id, ad, soyad) VALUES (p_hasta_id, p_ad, p_soyad);&lt;br&gt;
    COMMIT;&lt;br&gt;
    RETURN 'Hasta eklendi!';&lt;br&gt;
END;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Bir Function’ın DML işlemi yapması performans açısından risklidir çünkü SELECT sorgularında beklenmeyen yan etkiler oluşturabilir.&lt;br&gt;
Soru 3: Stored Procedure içinden Function çağırabilir miyiz?&lt;/p&gt;

&lt;p&gt;Evet, Stored Procedure içinden Function çağırabiliriz.&lt;/p&gt;

&lt;p&gt;Örneğin:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CREATE OR REPLACE PROCEDURE hasta_yas_goster(p_dogum_tarihi IN DATE)&lt;br&gt;
IS&lt;br&gt;
    v_yas NUMBER;&lt;br&gt;
BEGIN&lt;br&gt;
    v_yas := hasta_yasi_hesapla(p_dogum_tarihi);&lt;br&gt;
    DBMS_OUTPUT.PUT_LINE('Hastanın yaşı: ' || v_yas);&lt;br&gt;
END;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Bu prosedür, hasta_yasi_hesapla fonksiyonunu çağırarak sonucu ekrana yazdırır.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ne Zaman Stored Procedure, Ne Zaman Function Kullanmalıyız?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;📌 Stored Procedure Kullanılmalı:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Birden fazla işlem (DML + mantıksal işlemler) yapılacaksa
Çıktı birden fazla değişkene atanacaksa
Performans kritikse
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;📌 Function Kullanılmalı:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Tek bir değer döndürülmesi gerekiyorsa
Matematiksel hesaplamalar yapılacaksa
SELECT içinde kullanılacaksa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Sonuç&lt;/p&gt;

&lt;p&gt;Stored Procedure ve Function, PL/SQL geliştiricileri için vazgeçilmez iki araçtır. Hangisinin nerede kullanılacağını iyi bilmek, hem mülakatlarda hem de gerçek projelerde seni bir adım öne çıkarır.&lt;/p&gt;

&lt;p&gt;🎯 Özetle:&lt;br&gt;
✅ Stored Procedure, DML işlemleri yapabilir, birden fazla çıktı döndürebilir.&lt;br&gt;
✅ Function, mutlaka bir değer döndürür, SELECT içinde kullanılabilir.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🎯 SQL Trace ve TKPROF ile Performans Analizi Nasıl Yapılır?</title>
      <dc:creator>Cem GÖKSU</dc:creator>
      <pubDate>Wed, 26 Feb 2025 21:43:57 +0000</pubDate>
      <link>https://dev.to/cemgoksu/sql-trace-ve-tkprof-ile-performans-analizi-nasil-yapilir-ob6</link>
      <guid>https://dev.to/cemgoksu/sql-trace-ve-tkprof-ile-performans-analizi-nasil-yapilir-ob6</guid>
      <description>&lt;ol&gt;
&lt;li&gt;SQL Trace ve TKPROF Nedir?
SQL Trace Nedir?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;SQL Trace, Oracle veritabanında çalışan SQL sorgularını ve bunların yürütme istatistiklerini izlemeye yarayan bir özelliktir. SQL işlemlerinin performansını değerlendirmek için kullanılan düşük seviyeli bir izleme aracıdır.&lt;/p&gt;

&lt;p&gt;📌 SQL Trace ile elde edilen bilgiler:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sorgunun çalıştırılma süresi
Kullanılan CPU zamanı
Okunan blok sayısı
Bekleme olayları
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Bu bilgiler, performans darboğazlarını tespit etmek için kullanılır. Ancak, SQL Trace çıktısı ham veri içerdiğinden, okunması ve analiz edilmesi zordur. İşte burada TKPROF devreye girer.&lt;br&gt;
TKPROF Nedir?&lt;/p&gt;

&lt;p&gt;TKPROF (Trace Kernel Profiler), SQL Trace çıktısını anlamlı ve okunabilir hale getiren bir araçtır. TKPROF, sorgu istatistiklerini özetleyerek performans problemlerini tespit etmeyi kolaylaştırır.&lt;/p&gt;

&lt;p&gt;✅ TKPROF’un sağladığı avantajlar:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Yavaş çalışan SQL’leri tespit eder
CPU ve I/O kullanımlarını analiz eder
Index kullanımı ve yürütme planlarını gösterir
PL/SQL bloklarının detaylarını inceler
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;PL/SQL mülakatlarında performans analizi yapabilir misin? sorusuna SQL Trace ve TKPROF’u anlatan bir yanıt verebilirsen, fark yaratabilirsin.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;SQL Trace Nasıl Aktif Edilir?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Oracle’da SQL Trace’i etkinleştirmek için birkaç yöntem vardır. En yaygın kullanılan yöntemlerden biri, ALTER SESSION komutudur.&lt;br&gt;
&lt;code&gt;ALTER SESSION SET sql_trace = TRUE;&lt;/code&gt;&lt;br&gt;
Bu komut, geçerli oturumdaki tüm SQL sorgularının izlenmesini sağlar. İşlem tamamlandıktan sonra, trace dosyası UDUMP (User Dump) dizinine kaydedilir.&lt;/p&gt;

&lt;p&gt;Bir oturuma özgü SQL Trace etkinleştirmek için:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;EXEC DBMS_MONITOR.SESSION_TRACE_ENABLE(session_id =&amp;gt; 123, waits =&amp;gt; TRUE, binds =&amp;gt; TRUE);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Eğer spesifik bir SQL ID için trace açmak istiyorsan:&lt;/p&gt;

&lt;p&gt;EXEC DBMS_SQLTUNE.EXECUTE_TUNING_TASK(task_name =&amp;gt; 'my_task');&lt;/p&gt;

&lt;p&gt;📌 Dikkat: SQL Trace işlemi performansa yük getirebilir, bu yüzden üretim ortamında dikkatli kullanılmalıdır.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;TKPROF Kullanarak Performans Analizi&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;SQL Trace dosyasını oluşturduktan sonra, TKPROF ile analiz edebilirsin.&lt;/p&gt;

&lt;p&gt;İlk olarak, Trace dosyasının yerini belirle:&lt;/p&gt;

&lt;p&gt;SELECT value FROM v$diag_info WHERE name = 'Default Trace File';&lt;/p&gt;

&lt;p&gt;Ardından, TKPROF’u çalıştır:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;tkprof trace_dosyasi.trc cikti_dosyasi.prf EXPLAIN=username/password SORT=fchela&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;🔍 Parametre Açıklamaları:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;EXPLAIN: Plan açıklaması almak için kullanılır.
SORT: Sorguları belirli kriterlere göre sıralar.
    fchela: Fetch işlemlerine göre sıralar.
    execpu: CPU kullanımına göre sıralar.
    disk: Disk I/O’ya göre sıralar.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;📌 Örnek TKPROF Çıktısı:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F27du7ucp82mvlgkhsju3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F27du7ucp82mvlgkhsju3.png" alt="Image description" width="669" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu analiz sonucunda, hangi işlemlerin fazla kaynak tükettiğini tespit edip optimizasyon yapabilirsin.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;SQL Performansını Artırmak İçin İpuçları&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;TKPROF çıktısına göre aşağıdaki optimizasyon tekniklerini uygulayabilirsin:&lt;/p&gt;

&lt;p&gt;✔ Index Kullanımı: Eğer tablo taramaları fazla ise, uygun index eklenmeli.&lt;br&gt;
✔ Bind Variables Kullanımı: Hard parse’ı azaltmak için bind değişkenleri kullanılmalı.&lt;br&gt;
✔ Query Rewrite: Sorgular optimize edilmeli, gereksiz *&lt;em&gt;SELECT *&lt;/em&gt;* kullanımı önlenmeli.&lt;br&gt;
✔ Statistikler Güncellenmeli: ANALYZE veya DBMS_STATS.GATHER_TABLE_STATS komutları ile istatistikler güncel tutulmalı.&lt;br&gt;
✔ Bekleme Olaylarını İnceleme: Eğer db file sequential read, log file sync gibi bekleme olayları varsa, disk veya log dosyalarının iyileştirilmesi gerekebilir.&lt;br&gt;
Sonuç&lt;/p&gt;

&lt;p&gt;SQL Trace ve TKPROF, Oracle’da SQL performans analizi yapmak için kritik araçlardır. Bir PL/SQL mülakatında performans optimizasyonu hakkında konuşurken, bu araçların nasıl kullanıldığını bilmek seni güçlü bir aday yapar.&lt;/p&gt;

&lt;p&gt;🎯 Özetle:&lt;br&gt;
✅ SQL Trace ile sorguları izleyebilirsin.&lt;br&gt;
✅ TKPROF, bu sorguları analiz ederek anlamlı hale getirir.&lt;br&gt;
✅ TKPROF çıktısına göre sorguları optimize edebilirsin.&lt;/p&gt;

</description>
      <category>plsql</category>
      <category>oracle</category>
    </item>
  </channel>
</rss>
