Oracle PL/SQL LOOP cu Exemplu
Ce sunt buclele?
Buclele permit ca o anumită parte a codului dintr-un program să fie executată de numărul dorit de ori.
În acest tutorial, vom vedea conceptul de buclă în PL/SQL și fluxul de control în bucle.
Introducere în conceptul de bucle
Conceptul de bucle oferă următorul avantaj în codificare.
- Reutilizarea codului
- Dimensiunea redusă a codului
- Flux ușor de control
- Complexitate redusă
Diagrama de mai jos prezintă conceptul de buclă într-o manieră picturală
În diagrama de mai sus, se va verifica condiția buclei și, atâta timp cât condiția buclei este îndeplinită, blocul de execuție va fi executat.
În fiecare iterație, variabila contorului buclei care decide de fapt condiția buclei ar trebui să se modifice pentru a face ieșirea controlului din buclă. În unele cazuri, această variabilă contor de buclă este un operator de creștere/decrementare pentru un număr predefinit și, în unele cazuri, este o condiție de căutare care continuă să execute blocul până când îl satisface.
Declarații de control al buclei
Înainte de a învăța conceptul de bucle, este obligatoriu să înveți instrucțiunile de control al buclei. Instrucțiunile de control al buclei sunt cele care controlează de fapt fluxul de execuție în interiorul buclei. Mai jos este descrierea detaliată despre instrucțiunile de control al buclei.
CONTINUĂ
Acest cuvânt cheie trimite o instrucțiune motorului PL/SQL că ori de câte ori motorul PL/SQL întâlnește acest cuvânt cheie în interiorul buclei, atunci va sări peste codul rămas în blocul de execuție al codului, iar următoarea iterație va începe imediat. Acesta va fi folosit în principal dacă codul din interiorul buclei dorește să fie omis pentru anumite valori de iterație.
EXIT / EXIT CÂND
Acest cuvânt cheie trimite o instrucțiune motorului PL/SQL, care de fiecare dată când motorul PL/SQL întâlnește acest cuvânt cheie, va ieși imediat din bucla curentă. Dacă motorul PL/SQL întâlnește EXIT într-o buclă imbricată, atunci va ieși din bucla în care a fost definit, adică într-o buclă imbricată, oferind EXIT în bucla interioară va ieși din control numai din bucla interioară, dar nu din bucla exterioară. „EXIT WHEN” este urmat de o expresie care dă un rezultat boolean. Dacă rezultatul este TRUE, atunci controlul va IEȘI.
MERGI LA
Această declarație va transfera controlul către instrucțiunea etichetată („GOTO ;”). Aceasta are următoarele restricții
- Transferul controlului se poate face numai în cadrul subprogramelor.
- Transferul controlului nu se poate face de la partea de tratare a excepțiilor la partea de execuție
Utilizarea acestei declarații nu este recomandată decât dacă nu există alte alternative, deoarece trasabilitatea controlului codului va fi foarte dificilă în program din cauza transferului controlului de la o parte la alta.
Tipuri de buclă în PL/SQL
PL / SQL oferă următoarele trei tipuri de bucle
- Instrucțiunea de bază a buclei
- Instrucțiunea pentru buclă
- Instrucțiunea while loop
Instrucțiunea de bază a buclei
Această instrucțiune de buclă este cea mai simplă structură de buclă din PL/SQL. Blocul de execuție începe cu cuvântul cheie „LOOP” și se termină cu cuvântul cheie „END LOOP”.
Condiția de ieșire ar trebui să fie dată în interiorul acestui bloc de execuție, astfel încât controlul să iasă din buclă.
Este necesar ca cuvântul cheie EXIT să fie specificat în mod explicit în partea de execuție pentru a ieși din buclă.
LOOP <execution block starts> <EXIT condition based on developer criteria> <execution_block_ends> END LOOP;
Explicația sintaxei:
- În sintaxa de mai sus, cuvântul cheie „LOOP” marchează începutul buclei și „END LOOP” marchează sfârșitul buclei.
- Blocul de execuție conține tot codul care trebuie executat, inclusiv condiția EXIT.
- Partea de execuție poate conține orice instrucțiune de execuție.
Notă: Instrucțiunea buclă de bază fără cuvânt cheie EXIT va fi o buclă INFINITĂ care nu se va opri niciodată.
Exemplu 1: În acest exemplu, vom tipări numărul de la 1 la 5 folosind instrucțiunea buclă de bază. Pentru asta, vom executa următorul cod.
DECLARE a NUMBER:=1; BEGIN dbms_output.put_line('Program started.'); LOOP dbms_output.put_line(a); a:=a+1; EXIT WHEN a>5; END LOOP; dbms_output.put_line('Program completed'); END: /
Explicația codului:
- Linia de cod 2: Declararea variabilei „a” ca tip de date „NUMĂR” și inițializarea acesteia cu valoarea „1”.
- Linia de cod 4: Se imprimă declarația „Programul început”.
- Linia de cod 5: Cuvântul cheie „LOOP” marchează începutul buclei.
- Linia de cod 6: Imprimă valoarea lui „a”.
- Linia de cod 7: Crește valoarea lui „a” cu +1.
- Linia de cod 8: Verifică dacă valoarea lui „a” este mai mare decât 5.
- Linia de cod 9: Cuvântul cheie „END LOOP” marchează sfârșitul blocului de execuție.
- Codul de la linia 6 la linia 8 va continua să se execute până când „a” ajunge la valoarea 6, deoarece condiția va returna TRUE, iar controlul va IEȘI din buclă.
- Linia de cod 10: Tipărirea declarației „Program finalizat”
Etichetarea buclelor
În PL/SQL, buclele pot fi etichetate. Eticheta ar trebui să fie cuprinsă între „<<” și „>>”. Etichetarea buclelor, în special în codurile bucle imbricate, va oferi mai multă lizibilitate. Eticheta poate fi dată în comanda EXIT pentru a ieși din bucla respectivă. Folosind eticheta, controlul poate fi făcut să iasă direct din bucla exterioară a buclelor imbricate din orice loc din interiorul buclelor, dând comanda de ieșire urmată de eticheta buclei exterioare.
<<OUTER_LOOP>> LOOP <execution_block_starts> . <<INNER_LOOP>> LOOP --inner <execution_part> END LOOP; . <executi_block_ends> END LOOP;
Explicația sintaxei:
- În sintaxa de mai sus, bucla de ieșire mai are o buclă în interior.
- „< >" și "< >' sunt etichetele acestor bucle.
Exemplu 1: În acest exemplu, vom tipări numărul începând de la 1 folosind instrucțiunea buclă de bază. Fiecare număr va fi tipărit de câte ori este valoarea sa. Limita superioară a seriei este fixată la partea de declarare a programului. Să învățăm cum putem folosi conceptul de etichetă pentru a realiza acest lucru. Pentru asta, vom executa următorul cod
DECLARE a NUMBER:=0; b NUMBER; upper-limit NUMBER :=4; BEGIN dbms_output.put_line(‘Program started.' ); «outerloop» LOOP a:=a+1; b:=l; «inner loop» LOOP EXIT outer_loop WHEN a > upper_limit; dbms_output.put_line(a); b:=b+l; EXIT inner_loop WHEN b>a; END LOOP; END LOOP; dbms_output.put_line('Program completed.'); END; /
Explicația codului:
- Linia de cod 2-3: Declararea variabilei „a” și „b” ca tip de date „NUMĂR”.
- Linia de cod 4: Declararea variabilei „upper_limit” ca tip de date „NUMBER” cu valoarea „4”
- Linia de cod 6: Se imprimă declarația „Programul început”.
- Linia de cod 7: Bucla exterioară a fost etichetată ca „bucla_exterioară”
- Linia de cod 9: Valoarea lui „a” este incrementată cu 1.
- Linia de cod 11: Bucla interioară a fost etichetată ca „buclă_internă”.
- Linia de cod 13: Condiție EXIT care verifică dacă valoarea „a” este mai mare decât valoarea „limită_superioară”. Dacă nu, atunci va merge mai departe, altfel iese direct din bucla exterioară.
- Linia de cod 14: Imprimarea valorii lui „b”.
- Linia de cod 15: Crește valoarea lui „b” cu +1.
- Linia de cod 16: Condiție EXIT care verifică dacă valoarea lui „b” este mai mare decât „a”. Dacă da, atunci va ieși din control din bucla interioară.
- Linia de cod 14: Tipărirea declarației „Program finalizat”
Rezumat
Buclă | Bucla de bază |
Criterii EXIT | Ieșire când întâlnește cuvântul cheie „EXIT” în partea de execuție |
Folosire | Bun de utilizat atunci când ieșirea nu se bazează pe o anumită condiție. |