PL/SQL’de Cursor nasıl kullanılır? Cursor WITH HOLD ve WITHOUT HOLD nedir? PL/SQL’de REF CURSOR Nedir?

Cem GÖKSU - Feb 26 - - Dev Community

PL/SQL’de Cursor Kullanımı ve REF CURSOR Kavramı

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.

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.

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

  1. PL/SQL’de Cursor Nedir?

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

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

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

  1. Implicit Cursor (Gizli İmleç) Kullanımı

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

📌 Örnek Kullanım

DECLARE
v_hasta_adi VARCHAR2(50);
BEGIN
SELECT ad INTO v_hasta_adi FROM hastalar WHERE id = 101;
DBMS_OUTPUT.PUT_LINE('Hasta Adı: ' || v_hasta_adi);
END;

📌 Dikkat:

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.
Enter fullscreen mode Exit fullscreen mode
  1. Explicit Cursor (Açık İmleç) Kullanımı

Explicit Cursor, geliştirici tarafından manuel olarak tanımlanır ve yönetilir.

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

📌 Örnek Kullanım:

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

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

  1. Cursor WITH HOLD ve WITHOUT HOLD Nedir?

Oracle PL/SQL'de Cursor'lar varsayılan olarak WITHOUT HOLD olarak çalışır.

📢 WITH HOLD ve WITHOUT HOLD Farkı:

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.
Enter fullscreen mode Exit fullscreen mode

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

DECLARE
CURSOR hasta_cursor IS
SELECT id, ad FROM hastalar;
BEGIN
OPEN hasta_cursor; -- Transaction bitince kapanır (WITHOUT HOLD)
END;

  1. PL/SQL’de REF CURSOR Nedir? (Dinamik Cursor Kullanımı)

REF CURSOR, dinamik olarak tanımlanabilen ve herhangi bir sorguya bağlanabilen esnek bir Cursor türüdür.

📌 REF CURSOR Kullanım Senaryosu:

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.
Enter fullscreen mode Exit fullscreen mode

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

📌 Örnek REF CURSOR Kullanımı

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

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

  1. PL/SQL Mülakatlarında Cursor ile İlgili Gelebilecek Sorular

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

Cevap:

Implicit Cursor: Oracle tarafından otomatik oluşturulur (SELECT INTO).
Explicit Cursor: Kullanıcı tarafından manuel tanımlanır (CURSOR ... IS SELECT ...).
Enter fullscreen mode Exit fullscreen mode

Soru 2: REF CURSOR nedir? Ne zaman kullanılır?

Cevap:

REF CURSOR, dinamik cursor’dır, farklı sorgulara bağlanabilir.
Stored Procedure ile sonuç kümesi döndürmek için kullanılır.
Enter fullscreen mode Exit fullscreen mode

Soru 3: Cursor WITH HOLD ve WITHOUT HOLD farkı nedir?

Cevap:

WITH HOLD: Transaction sonrası cursor açık kalır.
WITHOUT HOLD: Transaction commit/rollback sonrası cursor kapanır (Oracle varsayılanı).
Enter fullscreen mode Exit fullscreen mode
  1. Sonuç

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.

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

. . . . . .