Čo je to Dynamic SQL?
Dynamic SQL je programátorská metodika na generovanie a spúšťanie príkazov za behu. Používa sa hlavne na písanie univerzálnych a flexibilných programov, kde budú príkazy SQL vytvárané a vykonávané za behu na základe požiadavky.
V tomto návode sa naučíte
- Spôsoby zápisu dynamického SQL
- NDS (natívne dynamické SQL) - okamžité vykonanie
- DBMS_SQL pre dynamické SQL
Spôsoby zápisu dynamického SQL
PL / SQL poskytuje dva spôsoby zápisu dynamického SQL
- NDS - natívne dynamické SQL
- DBMS_SQL
NDS (natívne dynamické SQL) - okamžité vykonanie
Natívna dynamická SQL je ľahší spôsob zápisu dynamickej SQL. Používa príkaz „EXECUTE IMMEDIATE“ na vytvorenie a vykonanie SQL za behu. Aby sme to však mohli použiť, je potrebné vopred poznať dátový typ a počet premenných, ktoré sa majú použiť za behu. Poskytuje tiež lepší výkon a menšiu zložitosť v porovnaní s databázou DBMS_SQL.
Syntax
EXECUTE IMMEDIATE()[INTO ][USING ]
- Vyššie uvedená syntax zobrazuje príkaz EXECUTE IMMEDIATE.
- Klauzula INTO je voliteľná a používa sa, iba ak dynamický SQL obsahuje príkaz select, ktorý načítava hodnoty. Typ premennej by sa mal zhodovať s typom premennej príkazu select.
- Klauzula USING je voliteľná a použije sa, iba ak dynamický SQL obsahuje ľubovoľnú premennú väzby.
Príklad 1 : V tomto príklade ideme načítať údaje z tabuľky emp pre emp_no '1001' pomocou príkazu NDS.
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;/
Výkon
Employee Name : XXXEmployee Number: 1001Salary: 15000Manager ED: 1000
Vysvetlenie kódu:
- Riadok kódu 2-6 : Deklarovanie premenných.
- Riadok kódu 8 : Rámcovanie SQL za behu. SQL obsahuje premennú väzby v podmienke ': empno'.
- Riadok kódu 9 : Spustenie zarámovaného textu SQL (ktorý sa vykonáva v riadku kódu 8) pomocou príkazu NDS „EXECUTE IMMEDIATE“
- Premenné v klauzule 'INTO' (lv_emp_name, ln_emp_no, ln_salary, ln_manager) sa používajú na uchovanie načítaných hodnôt z dotazu SQL (emp_name, emp_no, plat, manažér)
- Klauzula „USING“ poskytuje hodnoty premennej väzby v dotaze SQL (: emp_no).
- Riadok kódu 10-13 : Zobrazenie načítaných hodnôt.
DBMS_SQL pre dynamické SQL
PL / SQL poskytujú balík DBMS_SQL, ktorý vám umožní pracovať s dynamickým SQL. Proces vytvárania a vykonávania dynamického SQL obsahuje nasledujúci proces.
- OPEN CURSOR : Dynamický SQL sa bude vykonávať rovnakým spôsobom ako kurzor. Aby sme teda mohli vykonať príkaz SQL, musíme otvoriť kurzor.
- PARSE SQL : Ďalším krokom je analýza dynamického SQL. Tento proces iba skontroluje syntax a udrží dotaz pripravený na vykonanie.
- ZÁVÄZNÉ VARIABILNÉ hodnoty : Ďalším krokom je priradenie hodnôt pre premenné väzby, ak existujú.
- DEFINE COLUMN : Ďalším krokom je definovanie stĺpca pomocou ich relatívnych polôh vo výkaze select.
- EXECUTE : Ďalším krokom je vykonanie analyzovaného dotazu.
- FETCH VALUES : Ďalším krokom je načítanie vykonaných hodnôt.
- CLOSE CURSOR : Po načítaní výsledkov by mal byť kurzor zatvorený.
Príklad 1 : V tomto príklade budeme načítať údaje z tabuľky emp pre emp_no '1001' pomocou príkazu DBMS_SQL.
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:/
Výkon
Employee Name:XXXEmployee Number:1001Salary:15000Manager ID:1000
Vysvetlenie kódu:
- Riadok kódu 1-9 : Deklarácia premennej.
- Riadok kódu 10 : Zarámovanie príkazu SQL.
- Riadok kódu 11 : Otvorenie kurzora pomocou DBMS_SQL.OPEN_CURSOR. Vráti ID kurzora, ktorý je otvorený.
- Riadok kódu 12 : Po otvorení kurzora sa analyzuje SQL.
- Riadok kódu 13 : Viazaná premenná '1001' je priradená k ID kurzora namiesto ': empno'.
- Riadok kódu 14-17 : Definovanie názvu stĺpca na základe ich relatívnej polohy v príkaze SQL. V našom prípade je relatívna pozícia (1) emp_name, (2) emp_no (3) plat (4) manažér. Takže na základe tejto pozície definujeme cieľovú premennú.
- Riadok kódu 18 : Vykonanie dotazu pomocou DBMS_SQL.EXECUTE. Vráti počet spracovaných záznamov.
- Riadok kódu 19-33 : Načítanie záznamov pomocou slučky a ich zobrazenie.
- Riadok kódu 20: DBMS_SQL.FETCH_ROWS načíta jeden záznam zo spracovaných riadkov. Môže sa vyvolať opakovane, aby sa načítali všetky riadky. Ak nemôže načítať riadky, vráti hodnotu 0, čím opustí slučku.
Zhrnutie
V tejto časti sme diskutovali o dynamickom SQL a spôsoboch vykonávania DYNAMICKÉHO SQL. Videli sme tiež rôzne kroky pri vykonávaní dynamického SQL oboma spôsobmi. Videli sme tiež príklady, v ktorých sa rovnaký scenár spracováva v NDS aj DBMS_SQL spôsoboch vykonávania vykonania za behu.