Oracle PL / SQL Dinamik SQL Eğitimi: Anında Yürüt & DBMS_SQL

İçindekiler:

Anonim

Dinamik SQL nedir?

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

Bu eğitimde öğreneceksiniz-

  • Dinamik SQL yazmanın yolları
  • NDS (Yerel Dinamik SQL) - Hemen Yürüt
  • Dinamik SQL için DBMS_SQL

Dinamik SQL yazmanın yolları

PL / SQL, dinamik SQL yazmak için iki yol sağlar

  1. NDS - Yerel Dinamik SQL
  2. DBMS_SQL

NDS (Yerel Dinamik SQL) - Hemen Yürüt

Yerel Dinamik SQL, dinamik SQL yazmanın daha kolay yoludur. Çalışma zamanında SQL'i oluşturmak ve yürütmek için 'EXECUTE IMMEDIATE' komutunu kullanır. Ancak bu şekilde kullanmak için, bir ç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()[INTO][USING ]
  • Yukarıdaki sözdizimi EXECUTE IMMEDIATE komutunu gösterir.
  • INTO cümlesi 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 deyiminin değişken türüyle eşleşmelidir.
  • KULLANIM cümlesi 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 deyimini kullanarak emp_no '1001' için emp tablosundan verileri alacağız.

DECLARElv_sql VARCHAR2(500);lv_emp_name VARCHAR2(50):ln_emp_no NUMBER;ln_salary NUMBER;ln_manager NUMBER;BEGINly_sql:=;SELECT emp_name,emp_no,salary,manager FROM emp WHEREemp_no=:empmo:;EXECUTE IMMEDIATE lv_sql INTO lv_emp_name,ln_emp_no:ln_salary,ln_managerUSING 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 : XXXEmployee Number: 1001Salary: 15000Manager ED: 1000

Kod Açıklaması:

  • Kod satırı 2-6 : Değişkenleri bildirme.
  • Kod satırı 8 : Çalışma zamanında SQL çerçevesini oluşturma. SQL, ': empno' koşulundaki bağlama değişkenini içerir.
  • Kod satırı 9 : Çerçeveli SQL metnini (kod satırı 8'de yapılır) NDS komutunu 'EXECUTE IMMEDIATE' kullanarak yürütme
  • 'INTO' ifadesindeki değişkenler (lv_emp_name, ln_emp_no, ln_salary, ln_manager) SQL sorgusundan getirilen değerleri tutmak için kullanılır (emp_name, emp_no, salary, manager)
  • 'USING' deyimi, değerleri SQL sorgusundaki bağlama değişkenine verir (: emp_no).
  • Kod satırı 10-13 : Alınan değerleri görüntüleme.

Dinamik SQL için DBMS_SQL

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

  • OPEN CURSOR : Dinamik SQL, bir imleç ile aynı şekilde çalışacaktır. Dolayısıyla SQL ifadesini yürütmek için imleci açmalıyız.
  • PARSE SQL : Bir sonraki adım dinamik SQL'i ayrıştırmaktır. Bu işlem sadece sözdizimini kontrol edecek ve sorguyu çalışmaya hazır tutacaktır.
  • BIND VARIABLE Değerler : Bir sonraki adım, varsa bağlama değişkenleri için değerler atamaktır.
  • DEFINE COLUMN : Sonraki adım, select deyimindeki göreceli konumlarını kullanarak sütunu tanımlamaktır.
  • YÜRÜT : Bir sonraki adım, ayrıştırılmış sorguyu yürütmektir.
  • FETCH DEĞERLERİ : Bir sonraki adım, yürütülen değerleri almaktır.
  • CURSOR'U KAPAT : Sonuçlar alındığında, imleç kapatılmalıdır.

Örnek 1 : Bu örnekte, DBMS_SQL ifadesini kullanarak emp_no '1001' için emp tablosundan verileri alacağız.

DECLARElv_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;BEGINlv_sql:=‘SELECT emp_name,emp_no,salary,manager FROM emp WHEREemp_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);
LOOPIF DBMS_SQL.FETCH_ROWS(ln_cursor_id)=0THENEXIT;ELSEDBMS_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:XXXEmployee Number:1001Salary:15000Manager 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 : DBMS_SQL.OPEN_CURSOR kullanarak imleci açma. Açılan imleç kimliğini döndürecektir.
  • Kod satırı 12 : İmleç açıldıktan sonra SQL çözümlenir.
  • Kod satırı 13 : Bağlama değişkeni '1001', bunun yerine imleç kimliğine atıyor: empno
  • Kod satırı 14-17 : SQL ifadesindeki 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öneticisidir. Bu pozisyona dayanarak hedef değişkeni tanımlıyoruz.
  • Kod satırı 18 : Sorguyu DBMS_SQL.EXECUTE kullanarak yürütme. İşlenen kayıtların sayısını döndürür.
  • Kod satırı 19-33 : Bir döngü kullanarak kayıtların alınması ve aynısının görüntülenmesi.
  • Kod satırı 20: DBMS_SQL.FETCH_ROWS, işlenen satırlardan bir kayıt getirecektir. Tüm satırları almak için tekrar tekrar çağrılabilir. Satırları getiremezse, 0 döndürür, 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 de yürütmenin farklı adımlarını gördük. Aynı senaryonun, çalışma zamanında yürütmeyi gerçekleştirmek için hem NDS hem de DBMS_SQL yollarında ele alındığı örnekleri de gördük.