„Oracle PL / SQL Dynamic SQL Tutorial“: vykdykite neatidėliotiną & DBMS_SQL

Kas yra „Dynamic SQL“?

„Dynamic SQL“ yra programavimo metodika, skirta generuoti ir vykdyti sakinius vykdymo metu. Jis daugiausia naudojamas rašyti bendrosios paskirties ir lanksčias programas, kuriose SQL reikalavimai bus sukurti ir vykdomi vykdymo metu, atsižvelgiant į reikalavimus.

Šioje pamokoje sužinosite

  • Dinaminės SQL rašymo būdai
  • NDS (Native Dynamic SQL) - Vykdyti nedelsiant
  • DBMS_SQL, skirtas dinaminei SQL

Dinaminės SQL rašymo būdai

PL / SQL pateikia du būdus, kaip rašyti dinaminę SQL

  1. NDS - vietinė dinaminė SQL
  2. DBMS_SQL

NDS (Native Dynamic SQL) - Vykdyti nedelsiant

Gimtoji dinaminė SQL yra lengvesnis būdas rašyti dinaminę SQL. Jis naudoja komandą „VYKDYTI IŠ karto“, kad sukurtumėte ir vykdytumėte SQL vykdymo metu. Bet norint naudoti šį būdą, anksčiau reikia žinoti kintamojo, kuris bus naudojamas vykdymo metu, duomenų tipą ir skaičių. Tai taip pat suteikia geresnį našumą ir mažiau sudėtingumą lyginant su DBMS_SQL.

Sintaksė

EXECUTE IMMEDIATE()[INTO][USING ]
  • Aukščiau pateiktoje sintaksėje rodoma komanda VYKDYTI IŠ karto.
  • Sąlyga INTO yra neprivaloma ir naudojama tik tuo atveju, jei dinaminėje SQL yra pasirinktas sakinys, kuris gauna reikšmes. Kintamojo tipas turėtų atitikti „select“ sakinio kintamojo tipą.
  • Sąlyga NAUDOTI yra neprivaloma ir naudojama tik tuo atveju, jei dinaminėje SQL yra koks nors susiejimo kintamasis.

1 pavyzdys : Šiame pavyzdyje mes imsime duomenis iš emp_no '1001' emp lentelės naudodami NDS sakinį.

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

Rezultatas

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

Kodo paaiškinimas:

  • Kodo eilutė 2-6 : Kintamųjų deklaravimas.
  • 8 kodo eilutė : SQL rėminimas vykdymo metu. SQL yra susiejimo kintamasis, kur sąlygoje ': empno'.
  • 9 kodo eilutė : Įrėminto SQL teksto vykdymas (tai daroma 8 kodo eilutėje) naudojant NDS komandą „EXECUTE IMMEDIATE“
  • Kintamieji sąlygoje „INTO“ (lv_emp_name, ln_emp_no, ln_salary, ln_manager) naudojami sulaikant SQL užklausos vertes (emp_name, emp_no, alga, vadybininkas)
  • Sąlyga „NAUDOTI“ suteikia reikšmes susiejimo kintamajam SQL užklausoje (: emp_no).
  • Kodo eilutė 10-13 : rodomos gautos vertės.

DBMS_SQL, skirtas dinaminei SQL

PL / SQL pateikia DBMS_SQL paketą, kuris leidžia dirbti su dinamine SQL. Dinaminės SQL kūrimo ir vykdymo procese yra toks procesas.

  • ATIDARYTI ŽINUTINĮ : Dinaminė SQL bus vykdoma taip pat, kaip žymeklis. Taigi, norėdami įvykdyti SQL sakinį, turime atidaryti žymeklį.
  • PARSE SQL : Kitas žingsnis yra analizuoti dinaminę SQL. Šis procesas tiesiog patikrins sintaksę ir išlaikys užklausą parengtą vykdyti.
  • BIND KINTAMOSios reikšmės : Kitas žingsnis yra priskirti susiejančių kintamųjų reikšmes, jei tokių yra.
  • DEFINE COLUMN : Kitas žingsnis yra apibrėžti stulpelį, naudojant jų santykines pozicijas pasirinktame sakinyje.
  • VYKDYTI : Kitas žingsnis - vykdyti išanalizuotą užklausą.
  • TIKRINTI VERTYBES : Kitas žingsnis yra pareikšti įvykdytas reikšmes.
  • UŽDARYTI ŽENKLĄ : kai bus gauti rezultatai, žymeklis turėtų būti uždarytas.

1 pavyzdys : Šiame pavyzdyje mes ketiname gauti duomenis iš emp_no '1001' emp lentelės, naudodami DBMS_SQL sakinį.

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

Rezultatas

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

Kodo paaiškinimas:

  • 1-9 kodo eilutė : kintama deklaracija.
  • 10 kodo eilutė : SQL sakinio rėminimas.
  • 11 kodo eilutė : žymeklio atidarymas naudojant DBMS_SQL.OPEN_CURSOR. Jis grąžins atidarytą žymeklio ID.
  • 12 kodo eilutė : Atidarius žymeklį, SQL yra analizuojamas.
  • Kodo eilutė 13 : Įpareigojantis kintamasis „1001“ priskiriamas žymeklio ID vietoj „: empno“.
  • Kodo eilutė 14-17 : stulpelio pavadinimo apibrėžimas pagal jų santykinę padėtį SQL sakinyje. Mūsų atveju santykinė pozicija yra (1) emp_name, (2) emp_no (3) atlyginimas (4) manager. Taigi, remdamiesi šia padėtimi, mes apibrėžiame tikslinį kintamąjį.
  • 18 kodo eilutė : Užklausos vykdymas naudojant DBMS_SQL.EXECUTE. Tai pateikia apdorotų įrašų skaičių.
  • Kodo eilutė 19-33 : Įrašų gavimas naudojant kilpą ir tas pats.
  • 20 kodo eilutė: DBMS_SQL.FETCH_ROWS atkurs vieną įrašą iš apdorotų eilučių. Norint gauti visas eilutes, jį galima pakviesti pakartotinai. Jei jis negali gauti eilučių, jis grąžins 0, taigi išeis iš ciklo.

Santrauka

Šiame skyriuje aptarėme dinaminę SQL ir DYNAMIC SQL vykdymo būdus. Mes taip pat matėme skirtingus veiksmus vykdant dinaminę SQL abiem būdais. Taip pat matėme pavyzdžių, kai tas pats scenarijus yra vykdomas tiek NDS, tiek DBMS_SQL būdais, kaip vykdyti vykdymą vykdymo metu.

Įdomios straipsniai...