Mis on dünaamiline SQL?
Dünaamiline SQL on programmeerimise metoodika käskude loomiseks ja käitamiseks. Seda kasutatakse peamiselt üldotstarbeliste ja paindlike programmide kirjutamiseks, kus SQL-laused luuakse ja käivitatakse käivitamise ajal vastavalt nõudele.
Selles õpetuses saate teada
- Dünaamilise SQL-i kirjutamise viisid
- NDS (Native Dynamic SQL) - käivitage koheselt
- DBMS_SQL dünaamilise SQL-i jaoks
Dünaamilise SQL-i kirjutamise viisid
PL / SQL pakub dünaamilise SQL-i kirjutamiseks kahte võimalust
- NDS - pärismaine dünaamiline SQL
- DBMS_SQL
NDS (Native Dynamic SQL) - käivitage koheselt
Natiivne dünaamiline SQL on lihtsam viis dünaamilise SQL-i kirjutamiseks. See kasutab käsku EXECUTE IMMEDIATE SQL-i loomiseks ja käivitamiseks käivitamisel. Kuid sellisel viisil kasutamiseks peab enne käitamise ajal kasutatava muutuja andmetüüp ja arv olema teada. Samuti annab see parema jõudluse ja vähem keerukuse, kui võrrelda seda DBMS_SQL-iga.
Süntaks
EXECUTE IMMEDIATE()[INTO ][USING ]
- Ülaltoodud süntaks näitab käsku TÄITA KOHE.
- Klausel INTO on valikuline ja seda kasutatakse ainult siis, kui dünaamiline SQL sisaldab väärtuste toomiseks käsku select. Muutuja tüüp peaks vastama valitud lause muutuja tüübile.
- Klausel KASUTAMINE on valikuline ja seda kasutatakse ainult siis, kui dünaamiline SQL sisaldab sidumismuutujaid.
Näide 1 : Selles näites toome andmed emp_no '1001' emp tabelist, kasutades NDS-lauset.
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äljund
Employee Name : XXXEmployee Number: 1001Salary: 15000Manager ED: 1000
Koodi selgitus:
- Koodirida 2-6 : Muutujate deklareerimine.
- Koodirida 8 : SQL-i raamistamine käitamise ajal. SQL sisaldab sidumismuutujat tingimuses ': empno'.
- Koodirida 9 : raamitud SQL-teksti käivitamine (mis toimub koodireal 8), kasutades NDS-i käsku "EXECUTE IMMEDIATE"
- 'INTO' klausli muutujaid (lv_emp_name, ln_emp_no, ln_salary, ln_manager) kasutatakse SQL-päringust toodud väärtuste hoidmiseks (emp_name, emp_no, palk, manager)
- Klausel 'USING' annab väärtused SQL-päringu sidumismuutujale (: emp_no).
- Koodirida 10-13 : tõmmatud väärtuste kuvamine.
DBMS_SQL dünaamilise SQL-i jaoks
PL / SQL pakub DBMS_SQL paketti, mis võimaldab teil töötada dünaamilise SQL-iga. Dünaamilise SQL-i loomise ja käivitamise protsess sisaldab järgmist protsessi.
- AVATUD KURSOR : dünaamiline SQL käivitatakse samamoodi nagu kursor. Nii et SQL-i lause käivitamiseks peame kursori avama.
- PARSE SQL : Järgmine samm on dünaamilise SQL-i sõelumine. See protsess kontrollib lihtsalt süntaksit ja hoiab päringu täitmiseks valmis.
- BIND VARIABLE Väärtused : Järgmine samm on siduvate muutujate väärtuste määramine, kui neid on.
- MÄÄRATA VEERG : Järgmine samm on veeru määratlemine, kasutades nende suhtelisi positsioone valitud lauses.
- EXECUTE : Järgmine samm on parsitud päringu käivitamine.
- FETCH VALUES : Järgmine samm on täidetud väärtuste toomine.
- SULETUD KURSOR : Kui tulemused on toodud, peaks kursor olema suletud.
Näide 1 : Selles näites toome andmed emp_no '1001' emp tabelist, kasutades käsku 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äljund
Employee Name:XXXEmployee Number:1001Salary:15000Manager ID:1000
Koodi selgitus:
- Koodirida 1–9 : muutuja deklaratsioon.
- Koodirida 10 : SQL-i käsu raamistamine.
- Koodirida 11 : Kursori avamine DBMS_SQL.OPEN_CURSOR abil. See tagastab kursori ID, mis on avatud.
- Koodirida 12 : Pärast kursori avamist parsitakse SQL.
- Koodirida 13 : Siduv muutuja '1001' määratakse kursori ID-le ': empno'.
- Koodirida 14-17 : veeru nime määratlemine nende suhtelise positsiooni põhjal SQL-lauses. Meie puhul on suhteline positsioon (1) emp_name, (2) emp_no (3) palk (4) manager. Nii et selle positsiooni põhjal määratleme sihtmuutuja.
- Koodirida 18 : Päringu täitmine DBMS_SQL.EXECUTE abil. See tagastab töödeldud kirjete arvu.
- Koodirida 19-33 : kirjete toomine silmusega ja sama kuvamine.
- Koodirida 20: DBMS_SQL.FETCH_ROWS tõmbab töödeldud ridadest ühe kirje. Kõigi ridade toomiseks saab seda korduvalt helistada. Kui see ei saa ridu tuua, tagastatakse see 0, väljudes silmusest.
Kokkuvõte
Selles jaotises oleme arutanud dünaamilist SQL-i ja DYNAMIC SQL-i käivitamise viise. Samuti oleme näinud erinevaid samme dünaamilise SQL-i käivitamisel mõlemal viisil. Oleme näinud ka näiteid, kus sama stsenaariumi käsitletakse nii NDS-i kui ka DBMS_SQL-i viisidel käivitamise käivitamiseks.