Oracle PL/SQL Dinamik SQL Eğitimi: Anında ve DBMS_SQL'i Çalıştırma

Dinamik SQL nedir?

Dinamik SQL çalışma zamanında ifadeler oluşturmak ve çalıştırmak için kullanılan bir programlama metodolojisidir. Esas olarak SQL ifadelerinin gereksinime göre çalışma zamanında oluşturulacağı ve yürütüleceği genel amaçlı ve esnek programlar yazmak için kullanılır.

Dinamik SQL yazmanın yolları

PL/SQL, dinamik SQL yazmanın iki yolunu sunar

  1. NDS – Yerel Dinamik SQL
  2. DBMS_SQL

NDS (Yerel Dinamik SQL) – Anında Yürüt

Native Dynamic SQL, dinamik SQL yazmanın daha kolay yoludur. SQL'i çalışma zamanında oluşturmak ve yürütmek için 'EXECUTE IMMEDIATE' komutunu kullanır. Ancak bu şekilde kullanmak için, çalışma zamanında kullanılacak veri türü ve değişken sayısının önceden bilinmesi gerekir. Ayrıca DBMS_SQL ile karşılaştırıldığında daha iyi performans ve daha az karmaşıklık sağlar.

Sözdizimi

EXECUTE IMMEDIATE(<SQL>)
[INTO<variable>]
[USING <bind_variable_value>]
  • Yukarıdaki sözdizimi EXECUTE IMMEDIATE komutunu gösterir.
  • INTO yan tümcesi isteğe bağlıdır ve yalnızca dinamik SQL, değerleri getiren bir select ifadesi içeriyorsa kullanılır. Değişken türü, select ifadesinin değişken türüyle eşleşmelidir.
  • USING maddesi isteğe bağlıdır ve yalnızca dinamik SQL herhangi bir bağlama değişkeni içeriyorsa kullanılır.

Örnek 1: Bu örnekte, NDS ifadesini kullanarak emp_no '1001' için emp tablosundan verileri getireceğiz.

NDS - Hemen Yürüt

DECLARE
lv_sql VARCHAR2(500);
lv_emp_name VARCHAR2(50):
ln_emp_no NUMBER;
ln_salary NUMBER;
ln_manager NUMBER;
BEGIN
ly_sql:=;SELECT emp_name,emp_no,salary,manager FROM emp WHERE
emp_no=:empmo:;
EXECUTE IMMEDIATE lv_sql INTO lv_emp_name,ln_emp_no:ln_salary,ln_manager
USING 1001;
Dbms_output.put_line('Employee Name:‘||lv_emp_name);
Dbms_output.put_line('Employee Number:‘||ln_emp_no);
Dbms_output.put_line(‘Salary:'||ln_salaiy);
Dbms_output.put_line('Manager ID:‘||ln_manager);
END;
/

Çıktı

Employee Name : XXX 
Employee Number: 1001 
Salary: 15000 
Manager ED: 1000

Kod Açıklaması:

  • Kod satırı 2-6: Değişkenlerin bildirilmesi.
  • Kod satırı 8: SQL'in çalışma zamanında çerçevelenmesi. SQL, ':empno' koşulunda bağlama değişkenini içerir.
  • Kod satırı 9: Çerçeveli SQL metninin (kod satırı 8'de gerçekleştirilen) NDS 'HEMEN ÇALIŞTIR' komutunu kullanarak yürütülmesi
  • 'INTO' cümlesindeki değişkenler (lv_emp_name, ln_emp_no, ln_salary, ln_manager), SQL sorgusundan getirilen değerleri (emp_name, emp_no, maaş, yönetici) tutmak için kullanılır
  • 'USING' cümlesi, SQL sorgusundaki (:emp_no) bağlama değişkenine değerleri verir.
  • Kod satırı 10-13: Alınan değerlerin görüntülenmesi.

Dinamik SQL için DBMS_SQL

PL/SQL, dinamik SQL ile çalışmanıza olanak sağlayan DBMS_SQL paketini sağlar. Dinamik SQL'i oluşturma ve yürütme süreci aşağıdaki süreci içerir.

  • AÇIK İMLEÇ: Dinamik SQL, bir SQL ile aynı şekilde yürütülecektir. imleç. Bu nedenle SQL ifadesini yürütmek için imleci açmalıyız.
  • SQL'İ AYRIŞTIR: Bir sonraki adım dinamik SQL'i ayrıştırmaktır. Bu işlem yalnızca sözdizimini kontrol edecek ve sorguyu yürütülmeye hazır tutacaktır.
  • BIND DEĞİŞKENİ Değerleri: Bir sonraki adım, varsa bağlama değişkenleri için değerlerin atanmasıdır.
  • SÜTUN TANIMLA: Bir sonraki adım, sütunu select ifadesindeki göreceli konumlarını kullanarak tanımlamaktır.
  • UYGULA: Bir sonraki adım ayrıştırılmış sorguyu yürütmektir.
  • DEĞERLERİ GETİR: Bir sonraki adım yürütülen değerleri getirmektir.
  • İMLEÇİ KAPAT: Sonuçlar alındıktan sonra imleç kapatılmalıdır.

Örnek 1: Bu örnekte, DBMS_SQL ifadesini kullanarak emp_no '1001' için emp tablosundan veri çekeceğiz.

Dinamik SQL için DBMS_SQL

DECLARE
lv_sql VARCHAR2(500);
lv_emp_name VARCHAR2(50);
ln_emp_no NUMBER;
ln_salary NUMBER;
ln_manager NUMBER;
ln_cursor_id NUMBER;
ln_rows_processed;
BEGIN
lv_sql:=‘SELECT emp_name,emp_no,salary,manager FROM emp WHERE
emp_no=:empmo’;
in_cursor_id:=DBMS_SQL.OPEN_CURSOR;

DBMS_SQL.PARSE(ln_cursor_id,lv_sql,DBMS_SQL.NATIVE);

DBMS_SQL.BIXD_VARLABLE(ln_cursor_id,:‘empno‘,1001);

DBMS_SQL.DEFINE_COLUMN(ln_cursor_ici,1,ln_emp_name);
DBMS_SQL.DEFINE_COLUMN(ln_cursor_id,2,ln_emp_no);
DBMS_SQL .DEFINE_COLUMN(ln_cursor_id,3,ln_salary);
DBMS_SQL .DEFINE_COLUMN(ln_cursor_id,4,ln_manager);

ln_rows__processed:=DBMS_SQL.EXECUTE(ln_cursor_id);

Dinamik SQL için DBMS_SQL

LOOP
IF DBMS_SQL.FETCH_ROWS(ln_cursor_id)=0
THEN
EXIT;
ELSE
DBMS_SQL.COLUMN_VALUE(ln_cursor_id,1,lv_emp_name); 
DBMS_SQL.COLUMN_VALUE(ln_cursor_id,2,ln_emp_no);
DBMS_SQL.COLUMN_VALUE(ln_cursor_id,3,In_salary);
DBMS_SQL.COLUMN_VALUE(ln_cursor_id,4,In_manager);
Dbms_output.put_line('Employee Name:‘||lv_emp_name); 
Dbms_output.put_line('Employee Number:l‘||ln_emp_no); 
Dbms_output.put_line(‘Salary:‘||ln_salary); 
Dbms_output.put_line('Manager ID :‘| ln_manager);
END IF;
END LOOP;

DBMS_SQL.CLOSE_ClIRSOR(ln_cursor_id);

END:
/

Çıktı

Employee Name:XXX 
Employee Number:1001 
Salary:15000 
Manager ID:1000

Kod Açıklaması:

  • Kod satırı 1-9: Değişken bildirimi.
  • Kod satırı 10: SQL ifadesinin çerçevelenmesi.
  • Kod satırı 11: İmlecin DBMS_SQL.OPEN_CURSOR kullanılarak açılması. Açılan imleç kimliğini döndürecektir.
  • Kod satırı 12: İmleç açıldıktan sonra SQL ayrıştırılır.
  • Kod satırı 13: Bağlama değişkeni '1001', ':empno' yerine imleç kimliğine atıyor.
  • Kod satırı 14-17: SQL deyimindeki göreceli konumlarına göre sütun adını tanımlama. Bizim durumumuzda göreceli pozisyon (1) emp_name, (2) emp_no (3) maaş (4) yöneticidir. Yani bu pozisyona dayanarak hedef değişkeni tanımlıyoruz.
  • Kod satırı 18: Sorgunun DBMS_SQL.EXECUTE kullanılarak çalıştırılması. İşlenen kayıt sayısını döndürür.
  • Kod satırı 19-33: Kayıtların bir döngü kullanılarak getirilmesi ve görüntülenmesi.
  • Kod satırı 20: DBMS_SQL.FETCH_ROWS işlenen satırlardan bir kayıt getirecektir. Tüm satırları getirmek için tekrar tekrar çağrılabilir. Satırları getiremezse 0 değerini döndürür ve böylece döngüden çıkar.

ÖZET

Bu bölümde dinamik SQL'i ve DİNAMİK SQL'i çalıştırmanın yollarını tartıştık. Dinamik SQL'i her iki şekilde yürütmenin farklı adımlarını da gördük. Çalışma zamanında yürütme gerçekleştirmek için aynı senaryonun hem NDS hem de DBMS_SQL yollarında ele alındığı örnekleri de gördük.