Ce este Dynamic SQL?
Dynamic SQL este o metodologie de programare pentru generarea și executarea instrucțiunilor în timpul rulării. Este utilizat în principal pentru a scrie programe de uz general și flexibile în care instrucțiunile SQL vor fi create și executate în timp de execuție în funcție de cerință.
În acest tutorial, veți învăța-
- Modalități de a scrie SQL dinamic
- NDS (Native Dynamic SQL) - Executați imediat
- DBMS_SQL pentru SQL dinamic
Modalități de a scrie SQL dinamic
PL / SQL oferă două moduri de a scrie SQL dinamic
- NDS - SQL dinamic nativ
- DBMS_SQL
NDS (Native Dynamic SQL) - Executați imediat
SQL dinamic nativ este cel mai simplu mod de a scrie SQL dinamic. Folosește comanda „EXECUTE IMMEDIATE” pentru a crea și executa SQL în timpul rulării. Dar pentru a utiliza acest mod, tipul de date și numărul variabilei care trebuie utilizate la un timp de rulare trebuie să fie cunoscute înainte. De asemenea, oferă performanțe mai bune și mai puțină complexitate atunci când se compară cu DBMS_SQL.
Sintaxă
EXECUTE IMMEDIATE()[INTO ][USING ]
- Sintaxa de mai sus arată comanda EXECUTE IMMEDIATE.
- Clauza INTO este opțională și este utilizată numai dacă SQL-ul dinamic conține o instrucțiune select care preluează valori. Tipul variabilei trebuie să se potrivească cu tipul variabil al instrucțiunii select.
- Clauza UTILIZARE este opțională și este utilizată numai dacă SQL-ul dinamic conține orice variabilă de legare.
Exemplul 1 : În acest exemplu, vom prelua datele din tabela emp pentru emp_no '1001' folosind instrucțiunea 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;/
Ieșire
Employee Name : XXXEmployee Number: 1001Salary: 15000Manager ED: 1000
Explicatie cod:
- Linia de cod 2-6 : Declararea variabilelor.
- Linia de cod 8 : Încadrarea SQL la runtime. SQL conține variabila de legare în condiția unde: „empno”.
- Linia de cod 9 : Executarea textului SQL încadrat (care se face în linia de cod 8) folosind comanda NDS „EXECUTE IMMEDIATE”
- Variabilele din clauza „INTO” (lv_emp_name, ln_emp_no, ln_salary, ln_manager) sunt utilizate pentru a reține valorile preluate din interogarea SQL (emp_name, emp_no, salariu, manager)
- Clauza „USING” dă valorile variabilei de legare din interogarea SQL (: emp_no).
- Linia de cod 10-13 : Afișarea valorilor preluate.
DBMS_SQL pentru SQL dinamic
PL / SQL oferă pachetul DBMS_SQL care vă permite să lucrați cu SQL dinamic. Procesul de creare și executare a SQL dinamic conține următorul proces.
- CURSOR DESCHIS : SQL-ul dinamic se va executa în același mod ca și un cursor. Deci, pentru a executa instrucțiunea SQL, trebuie să deschidem cursorul.
- PARSE SQL : Pasul următor este analizarea SQL-ului dinamic. Acest proces va verifica doar sintaxa și va menține interogarea gata de executare.
- Valori BIND VARIABLE : Următorul pas este de a atribui valorile pentru variabilele de legare, dacă există.
- DEFINIȚI CULOANA : Următorul pas este să definiți coloana folosind pozițiile lor relative în instrucțiunea select.
- EXECUTA : Pasul următor este executarea interogării analizate.
- FETCH VALUE : Pasul următor este preluarea valorilor executate.
- ÎNCHIS CURSOR : Odată ce rezultatele sunt preluate, cursorul trebuie închis.
Exemplul 1 : În acest exemplu, vom prelua datele din tabela emp pentru emp_no '1001' folosind instrucțiunea 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:/
Ieșire
Employee Name:XXXEmployee Number:1001Salary:15000Manager ID:1000
Explicatie cod:
- Linia de cod 1-9 : Declarație variabilă.
- Linia de cod 10 : Încadrarea instrucțiunii SQL.
- Linia de cod 11 : Deschiderea cursorului folosind DBMS_SQL.OPEN_CURSOR. Acesta va returna ID-ul cursorului care este deschis.
- Linia de cod 12 : După deschiderea cursorului, SQL-ul este analizat.
- Linia de cod 13 : Variabila de legare „1001” atribuie în locul id-ului cursorului „: empno”.
- Linia de cod 14-17 : Definirea numelui coloanei pe baza poziției lor relative în instrucțiunea SQL. În cazul nostru, poziția relativă este (1) emp_name, (2) emp_no (3) salariu (4) manager. Deci, pe baza acestei poziții, definim variabila țintă.
- Linia de cod 18 : Executarea interogării folosind DBMS_SQL.EXECUTE. Returnează numărul de înregistrări procesate.
- Linia de cod 19-33 : Preluarea înregistrărilor folosind o buclă și afișarea aceluiași.
- Linia de cod 20: DBMS_SQL.FETCH_ROWS va prelua o înregistrare din rândurile procesate. Poate fi apelat în mod repetat pentru a prelua toate rândurile. Dacă nu poate prelua rânduri, va returna 0, ieșind astfel din buclă.
rezumat
În această secțiune, am discutat SQL dinamic și modalitățile de a executa SQL DINAMIC. De asemenea, am văzut diferiți pași în executarea SQL dinamic în ambele moduri. Am văzut, de asemenea, exemplele în care același scenariu este tratat atât în moduri NDS, cât și DBMS_SQL pentru a efectua execuția în timpul rulării.