Oracle PL/SQL Dynamic SQL Tutorial: Execute Immediate & DBMS_SQL

ล to je Dynamic SQL?

Dinamiฤan SQL je metodologija programiranja za generiranje i izvoฤ‘enje izraza u vrijeme izvoฤ‘enja. Uglavnom se koristi za pisanje programa opฤ‡e namjene i fleksibilnih programa gdje ฤ‡e se SQL naredbe kreirati i izvrลกavati tijekom izvoฤ‘enja na temelju zahtjeva.

Naฤini pisanja dinamiฤkog SQL-a

PL/SQL nudi dva naฤina pisanja dinamiฤkog SQL-a

  1. NDS โ€“ izvorni dinamiฤki SQL
  2. DBMS_SQL

NDS (Native Dynamic SQL) โ€“ Izvrลกi odmah

Izvorni dinamiฤki SQL lakลกi je naฤin za pisanje dinamiฤkog SQL-a. Koristi naredbu 'EXECUTE IMMEDIATE' za stvaranje i izvrลกavanje SQL-a za vrijeme izvoฤ‘enja. Ali da biste koristili ovaj naฤin, tip podataka i broj varijable koja ฤ‡e se koristiti u vremenu izvoฤ‘enja moraju biti poznati prije. Takoฤ‘er daje bolje performanse i manju sloลพenost u usporedbi s DBMS_SQL.

Sintaksa

EXECUTE IMMEDIATE(<SQL>)
[INTO<variable>]
[USING <bind_variable_value>]
  • Gornja sintaksa prikazuje naredbu EXECUTE IMMEDIATE.
  • Klauzula INTO nije obavezna i koristi se samo ako dinamiฤki SQL sadrลพi naredbu odabira koja dohvaฤ‡a vrijednosti. Tip varijable treba odgovarati tipu varijable izjave select.
  • Klauzula USING je izborna i koristi se samo ako dinamiฤki SQL sadrลพi bilo koju varijablu vezanja.

Primjer 1: U ovom primjeru ฤ‡emo dohvatiti podatke iz emp tablice za emp_no '1001' koristeฤ‡i NDS izjavu.

NDS - Izvrลกi odmah

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;
/

Izlaz

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

Objaลกnjenje koda:

  • Redak koda 2-6: Deklariranje varijabli.
  • Kodna linija 8: Uokvirivanje SQL-a tijekom izvoฤ‘enja. SQL sadrลพi varijablu vezanja u uvjetu where ':empno'.
  • Kodna linija 9: Izvrลกavanje uokvirenog SQL teksta (ลกto se radi u liniji koda 8) pomoฤ‡u NDS naredbe 'EXECUTE IMMEDIATE'
  • Varijable u klauzuli 'INTO' (lv_emp_name, ln_emp_no, ln_salary, ln_manager) koriste se za ฤuvanje dohvaฤ‡enih vrijednosti iz SQL upita (emp_name, emp_no, salary, manager)
  • Klauzula 'USING' daje vrijednosti varijabli vezanja u SQL upitu (:emp_no).
  • Redak koda 10-13: Prikaz dohvaฤ‡enih vrijednosti.

DBMS_SQL za dinamiฤki SQL

PL/SQL pruลพa paket DBMS_SQL koji vam omoguฤ‡uje rad s dinamiฤkim SQL-om. Proces kreiranja i izvoฤ‘enja dinamiฤkog SQL-a sadrลพi sljedeฤ‡i proces.

  • OTVORI POKAZOR: Dinamiฤki SQL ฤ‡e se izvrลกiti na isti naฤin kao a pokazivaฤ. Dakle, da bismo izvrลกili SQL naredbu, moramo otvoriti kursor.
  • PARSE SQL: Sljedeฤ‡i korak je analiziranje dinamiฤkog SQL-a. Ovaj proces ฤ‡e samo provjeriti sintaksu i zadrลพati upit spreman za izvrลกenje.
  • BIND VARIJABLA Vrijednosti: Sljedeฤ‡i korak je dodjeljivanje vrijednosti za varijable vezanja ako ih ima.
  • DEFINIRAJ STUPAC: Sljedeฤ‡i korak je definiranje stupca pomoฤ‡u njihovih relativnih poloลพaja u naredbi odabira.
  • IZVRล ITI: Sljedeฤ‡i korak je izvrลกavanje raลกฤlanjenog upita.
  • DOHVATI VRIJEDNOSTI: Sljedeฤ‡i korak je dohvaฤ‡anje izvrลกenih vrijednosti.
  • ZATVORI POKAZOR: Nakon ลกto su rezultati dohvaฤ‡eni, kursor bi trebao biti zatvoren.

Primjer 1: U ovom primjeru ฤ‡emo dohvatiti podatke iz emp tablice za emp_no '1001' koristeฤ‡i DBMS_SQL izjavu.

DBMS_SQL za dinamiฤki 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);

DBMS_SQL za dinamiฤki 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:
/

Izlaz

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

Objaลกnjenje koda:

  • Redak koda 1-9: Deklaracija varijable.
  • Kodna linija 10: Uokvirivanje SQL naredbe.
  • Kodna linija 11: Otvaranje kursora pomoฤ‡u DBMS_SQL.OPEN_CURSOR. Vratit ฤ‡e ID kursora koji je otvoren.
  • Kodna linija 12: Nakon ลกto se kursor otvori, SQL se analizira.
  • Kodna linija 13: Varijabla povezivanja '1001' dodjeljuje ID kursora umjesto ':empno'.
  • Redak koda 14-17: Definiranje naziva stupca na temelju njihovog relativnog poloลพaja u SQL izjavi. U naลกem sluฤaju, relativna pozicija je (1) emp_name, (2) emp_no (3) salary (4) manager. Dakle, na temelju ove pozicije definiramo ciljnu varijablu.
  • Kodna linija 18: Izvrลกavanje upita pomoฤ‡u DBMS_SQL.EXECUTE. Vraฤ‡a broj obraฤ‘enih zapisa.
  • Redak koda 19-33: Dohvaฤ‡anje zapisa pomoฤ‡u petlje i prikazivanje istih.
  • Redak koda 20: DBMS_SQL.FETCH_ROWS ฤ‡e dohvatiti jedan zapis iz obraฤ‘enih redaka. Moลพe se pozivati โ€‹โ€‹viลกe puta za dohvaฤ‡anje svih redaka. Ako ne moลพe dohvatiti retke, vratit ฤ‡e 0, ฤime se izlazi iz petlje.

Rezime

U ovom odjeljku raspravljali smo o dinamiฤkom SQL-u i naฤinima izvrลกavanja DYNAMIC SQL-a. Takoฤ‘er smo vidjeli razliฤite korake u izvrลกavanju dinamiฤkog SQL-a na oba naฤina. Takoฤ‘er smo vidjeli primjere u kojima se istim scenarijem rukuje u NDS i DBMS_SQL naฤinima za izvoฤ‘enje u vrijeme izvoฤ‘enja.

Saลพmite ovu objavu uz: