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

PL/SQL'de CURSOR nedir?

İmleç bu bağlam alanına yönelik bir işaretçidir. Oracle ifadeyle ilgili tüm bilgileri içeren bir SQL ifadesini işlemek için bağlam alanı oluşturur.

PL/SQL, programcının içerik alanını imleç aracılığıyla kontrol etmesine olanak tanır. Bir imleç, SQL deyiminin döndürdüğü satırları tutar. İmlecin tuttuğu satır kümesine etkin küme adı verilir. Bu imleçler kodun başka bir yerinden yönlendirilebilecek şekilde de adlandırılabilir.

İmleç iki türdendir.

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

örtük imleç

Veritabanında herhangi bir DML işlemi gerçekleştiğinde, söz konusu işlemde etkilenen satırları tutan örtülü bir imleç oluşturulur. Bu imleçler adlandırılamaz ve dolayısıyla kodun başka bir yerinden kontrol edilemez veya bunlara başvurulamaz. İmleç öznitelikleri aracılığıyla yalnızca en son imlece başvurabiliriz.

Açık İmleç

Programcıların, üzerinde daha fazla kontrol sahibi olmak amacıyla DML işlemlerini yürütmek üzere adlandırılmış içerik alanı oluşturmalarına izin verilir. Açık imleç, bildirimin bildirim bölümünde tanımlanmalıdır. PL/SQL bloğu, ve kodda kullanılması gereken 'SELECT' ifadesi için oluşturulmuştur.

Aşağıda açık imleçlerle çalışmayı içeren adımlar yer almaktadır.

  • İmlecin bildirilmesi İmleci bildirmek, bildirim bölümünde tanımlanan 'SELECT' ifadesi için adlandırılmış bir bağlam alanı oluşturmak anlamına gelir. Bu içerik alanının adı imleç adıyla aynıdır.
  • Açılış İmleciİmlecin açılması talimat verecektir. PL / SQL Bu imleç için bellek ayırmak için. İmleci kayıtları almaya hazır hale getirecektir.
  • İmleçten Veri AlmaBu işlemde 'SELECT' ifadesi çalıştırılır ve getirilen satırlar ayrılan hafızada saklanır. Bunlar artık aktif kümeler olarak adlandırılıyor. İmleçten veri almak kayıt düzeyinde bir etkinliktir; bu, verilere kayıt bazında erişebileceğimiz anlamına gelir. Her fetch ifadesi bir aktif kümeyi getirir ve söz konusu kaydın bilgilerini tutar. Bu ifade, kaydı getiren ve 'INTO' cümleciğindeki değişkene atayan 'SELECT' ifadesi ile aynıdır ancak herhangi bir istisna oluşturmaz.
  • İmleci kapatmaTü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 gerekir.

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 bildirimini ve getirilen verilerin atanacağı imleç değişkenini içerir.
  • İmleç, imleç bildiriminde verilen 'SELECT' ifadesi için oluşturulur.
  • Yürütme bölümünde bildirilen imleç açılır, getirilir ve kapatılır.

İmleç Nitelikleri

Hem Örtülü imleç hem de açık imleç, erişilebilen belirli özelliklere sahiptir. Bu nitelikler imleç işlemleri hakkında daha fazla bilgi verir. Aşağıda farklı imleç nitelikleri ve bunların kullanımı yer almaktadır.

İmleç Özelliği Açıklamalar
% BULUNAN En son getirme işlemi bir kaydı başarıyla getirdiyse 'TRUE' Boolean sonucunu döndürür, aksi takdirde FALSE değerini döndürür.
%BULUNAMADI Bu, %FOUND'un tersi şekilde çalışır ve en son getirme işlemi herhangi bir kayıt getiremezse 'TRUE' değerini döndürür.
%AÇIK Verilen imleç zaten açılmışsa 'TRUE' Boolean sonucunu döndürür, aksi halde 'FALSE' değerini döndürür
% ROWCOUNT Sayısal değeri döndürür. DML aktivitesinden etkilenen kayıtların gerçek sayısını verir.

Açık İmleç Örneği:

Bu örnekte, açık imlecin nasıl bildirileceğini, açılacağını, getirileceğini ve kapatılacağını göreceğiz.

Bir imleç kullanarak tüm çalışanın adını emp tablosundan yansıtacağız. Döngüyü imleçten tüm kayıtları getirecek şekilde ayarlamak için imleç özelliğini de kullanacağız.

Oracle PL/SQL İmleci

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%R0WCOUNT);
CLOSE guru99_det;
END:
/

Çıktı

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

Kod Açıklama

  • Kod satırı 2: 'SELECT emp_name FROM emp' ifadesi için guru99_det imlecinin bildirilmesi.
  • Kod satırı 3: lv_emp_name değişkeni bildiriliyor.
  • Kod satırı 5: Guru99_det imlecinin açılması.
  • Kod satırı 6: Temel döngü ifadesini 'emp' tablosundaki tüm kayıtları getirecek şekilde ayarlama.
  • Kod satırı 7: guru99_det verilerini getirir ve değeri lv_emp_name'e atar.
  • Kod satırı 9: İmleçteki tüm kaydın getirilip getirilmediğini bulmak için '%NOTFOUND' imleç özelliğini kullanma. Getirilirse 'TRUE' değerini döndürecek ve kontrol döngüden çıkacak, aksi takdirde kontrol imleçten verileri almaya devam edecek ve verileri yazdıracaktır.
  • Kod satırı 11: Döngü ifadesi için EXIT koşulu.
  • Kod satırı 12: Getirilen çalışanın adını yazdırın.
  • Kod satırı 14: İmleçte etkilenen/getirilen kayıtların toplam sayısını bulmak için '%ROWCOUNT' imleç özelliğini kullanma.
  • Kod satırı 15: Döngüden çıktıktan sonra imleç kapatılır ve ayrılan bellek serbest bırakılır.

FOR Döngüsü İmleç ifadesi

İmleçlerle çalışmak için “FOR LOOP” ifadesi kullanılabilir. FOR döngü deyiminde range limit yerine imleç ismini verebiliriz ki döngü imlecin ilk kaydından son kaydına kadar çalışsın. İmleç değişkeni, imlecin açılması, imlecin getirilmesi ve kapatılması FOR döngüsü tarafından örtülü olarak yapılacaktır.

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 ayarlanır ve bu durumda 'I' döngü değişkeni imleç değişkeni olarak davranacaktır.

Oracle Döngü Örneği İmleci:
Bu örnekte, imleç-FOR döngüsünü kullanarak emp tablosundaki tüm çalışan adlarını 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

Kod Açıklama

  • Kod satırı 2: 'SELECT emp_name FROM emp' ifadesi için guru99_det imlecinin bildirilmesi.
  • Kod satırı 4: İmleç için 'FOR' döngüsünü lv_emp_name döngü değişkeniyle oluşturmak.
  • Kod satırı 5: Döngünün her yinelemesinde çalışan adının yazdırılması.
  • Kod satırı 8: Döngüden çık

Not: Cursor-FOR döngüsünde, imlecin açılması, getirilmesi ve kapatılması örtülü olarak yapıldığı için imleç nitelikleri kullanılamaz. Döngü için.