Kaj je Dynamic SQL?
Dynamic SQL je programska metodologija za ustvarjanje in izvajanje izjav v času izvajanja. Uporablja se predvsem za pisanje splošnih in prilagodljivih programov, kjer bodo stavki SQL ustvarjeni in izvedeni v času izvajanja na podlagi zahteve.
V tej vadnici boste izvedeli-
- Načini pisanja dinamičnega SQL
- NDS (Native Dynamic SQL) - Takojšnje izvajanje
- DBMS_SQL za dinamični SQL
Načini pisanja dinamičnega SQL
PL / SQL ponuja dva načina za pisanje dinamičnega SQL
- NDS - izvorni dinamični SQL
- DBMS_SQL
NDS (Native Dynamic SQL) - Takojšnje izvajanje
Native Dynamic SQL je enostavnejši način za pisanje dinamičnega SQL. Za ustvarjanje in izvajanje SQL-ja med izvajanjem uporablja ukaz 'IZVRŠI TAKOJ'. Toda za uporabo na ta način je treba prej poznati tip podatkov in število spremenljivk, ki jih je treba uporabiti med izvajanjem. Omogoča tudi boljšo zmogljivost in manj zapletenosti v primerjavi z DBMS_SQL.
Sintaksa
EXECUTE IMMEDIATE()[INTO ][USING ]
- Zgornja sintaksa prikazuje ukaz EXECUTE IMMEDIATE.
- Klavzula INTO ni obvezna in se uporablja le, če dinamični SQL vsebuje stavek select, ki pridobi vrednosti. Tip spremenljivke se mora ujemati s tipom spremenljivke stavka select.
- Klavzula USING ni obvezna in se uporablja le, če dinamični SQL vsebuje katero koli vezno spremenljivko.
Primer 1 : V tem primeru bomo z uporabo stavka NDS pridobili podatke iz tabele emp za emp_no '1001'.
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;/
Izhod
Employee Name : XXXEmployee Number: 1001Salary: 15000Manager ED: 1000
Razlaga kode:
- Vrstica kode 2-6 : Navajanje spremenljivk.
- Vrstica kode 8 : Uokvirjanje SQL-ja v času izvajanja. SQL vsebuje spremenljivko za vezanje, kjer je stanje ': empno'.
- Vrstica kode 9 : Izvedba uokvirjenega besedila SQL (kar se izvede v vrstici kode 8) z uporabo ukaza NDS 'IZVRŠI TAKOJ'
- Spremenljivke v stavku 'INTO' (lv_emp_name, ln_emp_no, ln_salary, ln_manager) se uporabljajo za zadrževanje pridobljenih vrednosti iz poizvedbe SQL (emp_name, emp_no, plača, upravitelj)
- Stavek 'USING' daje vrednosti spremenljivki za vezanje v poizvedbi SQL (: emp_no).
- Vrstica kode 10-13 : Prikaz pridobljenih vrednosti.
DBMS_SQL za dinamični SQL
PL / SQL nudi paket DBMS_SQL, ki vam omogoča delo z dinamičnim SQL. Postopek ustvarjanja in izvajanja dinamičnega SQL vsebuje naslednji postopek.
- ODPRTI KURSOR : Dinamični SQL se bo izvajal na enak način kot kazalec. Za izvedbo stavka SQL moramo torej odpreti kurzor.
- PARSE SQL : Naslednji korak je razčlenitev dinamičnega SQL. Ta postopek bo samo preveril skladnjo in poizvedbo ohranil pripravljeno za izvedbo.
- Vrednosti BIND VARIABLE : Naslednji korak je dodelitev vrednosti za spremenljivke vezave, če obstajajo.
- DEFINIRAJ STOLPEC : Naslednji korak je določitev stolpca z uporabo njihovih relativnih položajev v stavku select.
- IZVEDI : Naslednji korak je izvedba razčlenjene poizvedbe.
- FETCH VALUES : Naslednji korak je priklicati izvedene vrednosti.
- ZAPRTO KURZOR : Ko so rezultati pridobljeni, je treba kazalec zapreti.
Primer 1 : V tem primeru bomo z uporabo stavka DBMS_SQL pridobili podatke iz tabele emp za emp_no '1001'.
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:/
Izhod
Employee Name:XXXEmployee Number:1001Salary:15000Manager ID:1000
Razlaga kode:
- Vrstica kode 1-9 : Deklaracija spremenljivke.
- Vrstica kode 10 : Uokvirjanje stavka SQL.
- Koda 11 : Odpiranje kurzorja z uporabo DBMS_SQL.OPEN_CURSOR. Vrnil bo id kurzorja, ki se odpre.
- Vrstica kode 12 : Ko se kazalka odpre, se SQL razčleni.
- Vrstica kode 13 : Spremenljivka vezave '1001' namesto ID-ja kazalca dodeli ': empno'.
- Vrstica kode 14-17 : Določitev imena stolpca glede na njihov relativni položaj v stavku SQL. V našem primeru je relativni položaj (1) emp_name, (2) emp_no (3) plača (4) manager. Na podlagi tega položaja določimo ciljno spremenljivko.
- Vrstica kode 18 : Izvajanje poizvedbe z uporabo DBMS_SQL.EXECUTE. Vrne število obdelanih zapisov.
- Vrstica kode 19-33 : Pridobivanje zapisov z zanko in prikaz istega.
- Vrstica kode 20: DBMS_SQL.FETCH_ROWS bo pobral en zapis iz obdelanih vrstic. Lahko ga večkrat pokličete, da pridobite vse vrstice. Če vrstic ne more pridobiti, bo vrnil 0 in tako zapustil zanko.
Povzetek
V tem poglavju smo razpravljali o dinamičnem SQL-ju in načinih izvajanja DYNAMIC SQL-a. Prav tako smo videli različne korake pri izvajanju dinamičnega SQL na oba načina. Videli smo tudi primere, v katerih se isti scenarij obravnava tako v NDS kot v DBMS_SQL, da se izvede izvajanje med izvajanjem.