Kas ir Dynamic SQL?
Dinamiskā SQL ir programmēšanas metodika priekšrakstu ģenerēšanai un izpildei izpildes laikā. To galvenokārt izmanto, lai rakstītu vispārējas nozīmes un elastīgas programmas, kur SQL priekšrakstus izveidos un izpildīs izpildes laikā, pamatojoties uz prasībām.
Šajā apmācībā jūs uzzināsiet
- Veidi, kā rakstīt dinamisku SQL
- NDS (vietējā dinamiskā SQL) - izpildiet tūlīt
- DBMS_SQL dinamiskai SQL
Veidi, kā rakstīt dinamisku SQL
PL / SQL nodrošina divus veidus, kā rakstīt dinamisku SQL
- NDS - vietējā dinamiskā SQL
- DBMS_SQL
NDS (vietējā dinamiskā SQL) - izpildiet tūlīt
Vietējā dinamiskā SQL ir vienkāršāks veids, kā rakstīt dinamisko SQL. Tas izmanto komandu EXECUTE IMMEDIATE, lai izveidotu un izpildītu SQL izpildes laikā. Bet, lai izmantotu šādā veidā, iepriekš jāzina datu tipam un mainīgā lielumam, kas jāizmanto izpildes laikā. Tas arī nodrošina labāku veiktspēju un mazāk sarežģītību, salīdzinot ar DBMS_SQL.
Sintakse
EXECUTE IMMEDIATE()[INTO ][USING ]
- Iepriekš aprakstītajā sintaksē tiek parādīta komanda EXECUTE IMMEDIATE.
- Klauss INTO nav obligāts un tiek izmantots tikai tad, ja dinamiskajā SQL ir atlasīts priekšraksts, kas iegūst vērtības. Mainīgā tipam jāsakrīt ar select priekšraksta mainīgā tipu.
- Klauzula LIETOŠANA nav obligāta un tiek izmantota tikai tad, ja dinamiskajā SQL ir kāds saistošs mainīgais.
1. piemērs : Šajā piemērā mēs iegūsim datus no emp tabulas emp_no '1001' emp tabulas, izmantojot NDS priekšrakstu.
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;/
Rezultāts
Employee Name : XXXEmployee Number: 1001Salary: 15000Manager ED: 1000
Koda skaidrojums:
- Kodu rinda 2-6 : Mainīgo deklarēšana.
- 8. koda rindiņa : SQL ierāmēšana izpildes laikā. SQL satur saistošo mainīgo, kur nosacījums ': empno'.
- 9. koda rindiņa : Izpildītā ierāmētā SQL teksta izpilde (kas tiek izdarīta 8. koda rindā), izmantojot komandu NDS 'EXECUTE IMMEDIATE'
- Mainīgos klauzulā “INTO” (lv_emp_name, ln_emp_no, ln_salary, ln_manager) izmanto, lai turētu SQL vaicājumā iegūtās vērtības (emp_name, emp_no, alga, vadītājs)
- "USING" klauzula piešķir vērtības saistošajam mainīgajam SQL vaicājumā (: emp_no).
- Kodu rinda 10-13 : parādīto vērtību parādīšana.
DBMS_SQL dinamiskai SQL
PL / SQL nodrošina DBMS_SQL pakotni, kas ļauj strādāt ar dinamisko SQL. Dinamiskās SQL izveides un izpildes process satur šādu procesu.
- OPEN CURSOR : Dinamiskā SQL tiks izpildīta tāpat kā kursors. Tātad, lai izpildītu SQL priekšrakstu, mums jāatver kursors.
- PARSĒT SQL : Nākamais solis ir parsēt dinamisko SQL. Šis process vienkārši pārbaudīs sintaksi un saglabās vaicājumu gatavu izpildei.
- BIND VARIABLE Vērtības : Nākamais solis ir saistošo mainīgo vērtību piešķiršana, ja tādas ir.
- DEFINE COLUMN : Nākamais solis ir kolonnas definēšana, izmantojot to relatīvās pozīcijas atlasītajā paziņojumā.
- EXECUTE : Nākamais solis ir parsētā vaicājuma izpilde.
- FETCH VALUES : Nākamais solis ir izpildīto vērtību ielāde.
- SLĒGT KURSU : Kad rezultāti ir iegūti, kursors ir jāaizver.
1. piemērs : Šajā piemērā mēs iegūsim datus no emp tabulas emp_no '1001' emp tabulas, izmantojot DBMS_SQL priekšrakstu.
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:/
Rezultāts
Employee Name:XXXEmployee Number:1001Salary:15000Manager ID:1000
Koda skaidrojums:
- Kodu rinda 1-9 : Mainīga deklarācija.
- 10. koda rindiņa : SQL priekšraksta ierāmēšana.
- 11. koda rindiņa : kursora atvēršana, izmantojot DBMS_SQL.OPEN_CURSOR. Tas atgriezīs atvērto kursora ID.
- 12. koda rindiņa : Pēc kursora atvēršanas SQL tiek parsēts.
- 13. koda rindiņa : saistošais mainīgais “1001” tiek piešķirts kursora ID vietā “: empno”.
- Kodu rinda 14-17 : kolonnas nosaukuma noteikšana, pamatojoties uz to relatīvo pozīciju SQL priekšrakstā. Mūsu gadījumā relatīvā pozīcija ir (1) emp_name, (2) emp_no (3) alga (4) vadītājs. Tātad, pamatojoties uz šo pozīciju, mēs definējam mērķa mainīgo.
- 18. koda rindiņa : vaicājuma izpilde, izmantojot DBMS_SQL.EXECUTE. Tas atgriež apstrādāto ierakstu skaitu.
- Kodu rinda 19-33 : ierakstu ielāde, izmantojot cilpu, un to pašu parādīšana.
- 20. koda rindiņa: DBMS_SQL.FETCH_ROWS izgūs vienu ierakstu no apstrādātām rindām. To var atkārtoti izsaukt, lai ielādētu visas rindas. Ja tas nevar ienest rindas, tas atgriezīsies 0, tādējādi izejot no cilpas.
Kopsavilkums
Šajā sadaļā mēs esam apsprieduši dinamisko SQL un veidus, kā izpildīt DYNAMIC SQL. Mēs esam redzējuši arī dažādos soļus dinamiskās SQL izpildē abos veidos. Mēs esam redzējuši arī piemērus, kuros viens un tas pats scenārijs tiek apstrādāts gan NDS, gan DBMS_SQL veidos, kā izpildi izpildes laikā.