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
- NDS โ izvorni dinamiฤki SQL
- 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.
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.
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);
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.



