Oracle PL/SQL İmleci: Örtülü, Açık, Örnekli Döngü İçin

⚡ Akıllı Özet

İmleçler Oracle PL/SQL'de, SQL sorgusu tarafından döndürülen satırları tutan bağlam alanına işaret eden göstericilerdir. İki türü vardır: DML için otomatik olarak oluşturulan örtük imleçler ve programcı tarafından tanımlanan ve kontrol edilen açık imleçler.

  • 📍 Bağlam Alanı: İmleç, bir SQL ifadesini ve bu ifadenin döndürdüğü etkin kümeyi saklayan bağlam alanını gösterir.
  • ⚙️ Örtülü İmleç: Oracle Her DML ifadesi ve tek satırlı SELECT INTO sorgusu için otomatik olarak örtük bir imleç açar.
  • ✋ Açık İmleç: Bir programcı, tam kontrol sağlamak için açık bir imleç tanımlar, açar, getirir ve kapatır.
  • 🔎 İmleç Özellikleri: %FOUND, %NOTFOUND, %ISOPEN ve %ROWCOUNT en son işlemin durumunu bildirir.
  • 🔁 İmleç FOR Döngüsü: FOR döngüsü, herhangi bir manuel işleme gerek kalmadan, imleci otomatik olarak açar, getirir ve kapatır.
  • 🤖 Yapay Zeka Yardımı: GitHub Copilot gibi yapay zeka asistanları, taslak imleç döngüleri oluşturur ve kapanmamış imleçleri işaretler.

Oracle PL/SQL İmleci Örtük, Açık ve FOR Döngüsü

PL/SQL'de CURSOR nedir?

İmleç, bağlam alanına işaret eden bir göstericidir. Oracle bir işlemi işlemek için bir bağlam alanı oluşturur. SQL Bu açıklama, bu alanda açıklamayla ilgili tüm bilgileri içermektedir.

PL / SQL Programcının imleç aracılığıyla bağlam alanını kontrol etmesine olanak tanır. İmleç, SQL sorgusu tarafından döndürülen satırları tutar ve imlecin tuttuğu satır kümesine aktif küme denir. Bu imleçlere, kodun başka bir yerinden referans verilebilmesi için isim de verilebilir.

İmleç iki türdedir:

  • örtük imleç
  • Açık İmleç

örtük imleç

Ne zaman herhangi bir DML işlemi Veritabanında bir işlem gerçekleştiğinde, o işlemden etkilenen satırları tutan örtük bir imleç oluşturulur. Bu imleçlere isim verilemez ve bu nedenle kodun başka bir yerinden kontrol edilemez veya bunlara başvurulamaz. Yalnızca imleç öznitelikleri aracılığıyla en son imlece başvurabiliriz.

Açık İmleç

Programcılar, DML işlemlerini yürütmek ve üzerinde daha fazla kontrol sahibi olmak için adlandırılmış bir bağlam alanı oluşturabilirler. Açık imleç, bildirim bölümünde tanımlanmalıdır. PL/SQL bloğuVe bu, kodda kullanılması gereken SELECT sorgusu için oluşturulmuştur.

Aşağıda, açık imleçlerle çalışma adımları verilmiştir:

  • İmleci tanımlama: İmleci tanımlamak, basitçe, bildirim bölümünde tanımlanan SELECT ifadesi için adlandırılmış bir bağlam alanı oluşturmak anlamına gelir. Bu bağlam alanının adı, imleç adıyla aynıdır.
  • İmleci açma: İmleci açmak, PL/SQL'e bu imleç için bellek ayırması talimatını verir. Bu, imleci kayıtları getirmeye hazır hale getirir.
  • İmleçten veri alınıyor: Bu işlemde, SELECT ifadesi yürütülür ve getirilen satırlar ayrılan belleğe kaydedilir. Bunlara artık aktif kümeler denir. İmleçten veri getirme, kayıt düzeyinde bir işlemdir; yani verilere kayıt bazında erişebiliriz. Her getirme ifadesi bir aktif küme getirir ve o belirli kaydın bilgilerini tutar. Bu ifade, kaydı getiren ve INTO yan tümcesindeki değişkene atayan bir SELECT ifadesiyle aynıdır, ancak herhangi bir hata fırlatmaz. istisnalar.
  • İmleci kapatma: Tüm kayıtlar alındıktan sonra, bu bağlam alanına ayrılan belleğin serbest bırakılması için imleci kapatmamız gerekiyor.

Sözdizimi

DECLARE
CURSOR <cursor_name> IS <SELECT statement>;
<cursor_variable declaration>;
BEGIN
OPEN <cursor_name>;
FETCH <cursor_name> INTO <cursor_variable>;
.
.
CLOSE <cursor_name>;
END;

Yukarıdaki sözdiziminde, bildirim kısmı imlecin ve getirilen verilerin atanacağı imleç değişkeninin bildirimini içerir. İmleç, imleç bildiriminde verilen SELECT ifadesi için oluşturulur. Yürütme kısmında, bildirilen imleç açılır, veri getirilir ve kapatılır.

İmleç Nitelikleri

Hem örtük imleç hem de açık imleç, erişilebilen belirli özelliklere sahiptir. Bu özellikler, imleç işlemleri hakkında daha fazla bilgi verir. Aşağıda farklı imleç özellikleri ve kullanımları yer almaktadır.

İmleç Özelliği Açıklama
% BULUNAN En son yapılan kayıt alma işlemi başarılı olursa TRUE, aksi takdirde FALSE Boolean sonucunu döndürür.
%BULUNAMADI %FOUND'un tam tersi şekilde çalışır. En son veri çekme işlemi hiçbir kayıt getiremediyse TRUE değerini döndürür.
%AÇIK Verilen imleç zaten açıksa TRUE, aksi takdirde FALSE Boolean sonucunu döndürür.
% ROWCOUNT İşlemden etkilenen veya işlemin getirdiği kayıtların gerçek sayısını veren sayısal bir değer döndürür.

İmlecin Açıkça Belirtilmiş Örneği: Bu örnekte, açık bir imleci nasıl tanımlayacağımızı, açacağımızı, getireceğimizi ve kapatacağımızı göreceğiz. İmleç kullanarak emp tablosundaki tüm çalışan isimlerini yansıtacağız. Ayrıca, imleçten tüm kayıtları getirmek için döngüyü ayarlamak üzere bir imleç özniteliği kullanacağız.

Aşağıdaki ekran görüntüsü, bu açık imleç örneğini ve çıktısını göstermektedir. Oracle.

Örnek olarak, emp tablosundan çalışan adlarını getiren açık imleç kullanımı. Oracle PL / SQL

DECLARE
CURSOR guru99_det IS SELECT emp_name FROM emp;
lv_emp_name emp.emp_name%type;
BEGIN
OPEN guru99_det;
LOOP
FETCH guru99_det INTO lv_emp_name;
IF guru99_det%NOTFOUND
THEN
EXIT;
END IF;
Dbms_output.put_line('Employee Fetched:'||lv_emp_name);
END LOOP;
Dbms_output.put_line('Total rows fetched is'||guru99_det%ROWCOUNT);
CLOSE guru99_det;
END;
/

Çıktı

Employee Fetched:BBB
Employee Fetched:XXX
Employee Fetched:YYY
Total rows fetched is 3

Code açıklama

  • Code 2 hattı: 'SELECT emp_name FROM emp' sorgusu için guru99_det imleci tanımlanıyor.
  • Code 3 hattı: lv_emp_name değişkenini şu şekilde tanımlıyoruz: % türü emp.emp_name'e sabitlenmiştir.
  • Code 5 hattı: İmleci açma işlemi guru99_det ile gerçekleştiriliyor.
  • Code 6 hattı: Temel döngü ifadesini, emp tablosundaki tüm kayıtları getirecek şekilde ayarlıyoruz.
  • Code 7 hattı: guru99_det verilerini getirir ve değeri lv_emp_name değişkenine atar.
  • Code 8 hattı: İmleçteki tüm kayıtların getirilip getirilmediğini kontrol etmek için imleç özniteliği olan %NOTFOUND kullanılır. Getirilmişse TRUE döndürülür ve kontrol döngüden çıkar; aksi takdirde kontrol, imleçten verileri getirmeye devam eder ve yazdırır.
  • Code 10 hattı: Döngü ifadesi için EXIT koşulu.
  • Code 12 hattı: Getirilen çalışanın adını yazdırın.
  • Code 14 hattı: İmleç tarafından getirilen toplam kayıt sayısını bulmak için imleç özniteliği %ROWCOUNT kullanılır.
  • Code 15 hattı: Döngüden çıkıldıktan sonra imleç kapatılır ve ayrılan bellek serbest bırakılır.

FOR Döngüsü İmleç ifadesi

bir imleç Döngü için İmleçlerle çalışmak için kullanılabilir. FOR döngüsü ifadesinde aralık sınırı yerine imleç adını verebiliriz, böylece döngü imlecin ilk kaydından son kaydına kadar çalışır. İmleç değişkeni, imlecin açılması, veri alınması ve imlecin kapatılması işlemleri FOR döngüsü tarafından örtük olarak gerçekleştirilir.

Sözdizimi

DECLARE
CURSOR <cursor_name> IS <SELECT statement>;
BEGIN
FOR I IN <cursor_name>
LOOP
.
.
END LOOP;
END;

Yukarıdaki sözdiziminde, bildirim kısmı imlecin bildirimini içerir. İmleç, imleç bildiriminde verilen SELECT ifadesi için oluşturulur. Yürütme kısmında, bildirilen imleç FOR döngüsünde kurulur ve bu durumda döngü değişkeni 'I' imleç değişkeni gibi davranır.

Oracle For döngüsü örneği için imleç kullanımı: Bu örnekte, imleç-FOR döngüsü kullanarak emp tablosundaki tüm çalışan isimlerini yansıtacağız.

DECLARE
CURSOR guru99_det IS SELECT emp_name FROM emp;
BEGIN
FOR lv_emp_name IN guru99_det
LOOP
Dbms_output.put_line('Employee Fetched:'||lv_emp_name.emp_name);
END LOOP;
END;
/

Çıktı

Employee Fetched:BBB
Employee Fetched:XXX
Employee Fetched:YYY

Code açıklama

  • Code 2 hattı: 'SELECT emp_name FROM emp' sorgusu için guru99_det imleci tanımlanıyor.
  • Code 4 hattı: lv_emp_name döngü değişkenini kullanarak imleç için FOR döngüsünü oluşturma.
  • Code 6 hattı: Döngünün her yinelemesinde çalışan adının yazdırılması.
  • Code 7 hattı: Döngüden çık (END LOOP).

Not: İmleç-FOR döngüsünde, imlecin açılması, alınması ve kapatılması FOR döngüsü tarafından örtük olarak yapıldığından, imleç öznitelikleri kullanılamaz.

SSS

REF CURSOR (imleç değişkeni), bir sorgu sonuç kümesine işaret eden bir göstericidir. Statik bir imlecin aksine, çalışma zamanında farklı sorgular açabilir ve sonuçları PL/SQL blokları arasında veya istemci programlarına aktarabilir.

Normal bir imleç, her FETCH işleminde yalnızca bir satır getirir ve bu da birçok bağlam değişikliğine neden olur. TOPLU TOPLAMA Tek bir işlemle birçok satırı bir koleksiyona yükleyerek, büyük sonuç kümelerinde işlem yükünü önemli ölçüde azaltır.

Evet. CURSOR c(dept NUMBER) IS SELECT … gibi parametreli bir imleç tanımlayın, ardından OPEN c(10) komutunda değerler geçirin. Parametreler, farklı filtre değerleriyle tek bir imleç tanımını yeniden kullanmanıza olanak tanır.

FOR UPDATE ifadesi, imlecin seçtiği satırları kilitler, böylece başka hiç kimse bunları değiştiremez. WHERE CURRENT OF ifadesi ise, WHERE koşulunu tekrarlamadan, tam olarak o anda getirilen satırı günceller veya siler.

Açık imleçler belleklerini korur ve OPEN_CURSORS sınırına dahil edilir. Çok sayıda imleç açık bırakmak sonunda ORA-01000: maksimum açık imleç sayısı aşıldı hatasına neden olur, bu nedenle her kullanımdan sonra açık bir imleci KAPATIN.

Her bir FETCH işlemi, PL/SQL ve SQL motorları arasında geçiş yapar. Binlerce bu tür bağlam geçişi bir araya geldiğinde, tek bir küme tabanlı SQL ifadesi veya BULK COLLECT işlemi genellikle aynı satırları çok daha hızlı işler.

Evet. GitHub Yardımcı Pilotu Yorum satırından açıkça OPEN, FETCH ve CLOSE döngüleri veya imleç FOR döngüleri taslakları oluşturur, %NOTFOUND çıkış kontrolleri ekler ve öznitelik adları önerir; ancak önce mantığı gözden geçirmeniz gerekir.

Yapay zekâ asistanları, küme tabanlı SQL veya BULK COLLECT'e dönüşebilecek satır satır imleç döngülerini işaretler, kapanmamış imleçleri tespit eder ve %attribute davranışını açıklar. Bu makine öğrenimi incelemesi, kod üretime geçmeden önce performansı iyileştirir.

Bu yazıyı şu şekilde özetleyin: