Oracle PL/SQL-silmukka esimerkin kanssa

⚡ Älykäs yhteenveto

PL/SQL-silmukat suorittavat koodin osan toistuvasti halutun määrän kertoja. PL/SQL tarjoaa perus-, FOR- ja WHILE-silmukoita, joita ohjataan CONTINUE-, EXIT-, EXIT WHEN- ja GOTO-komennoilla, ja silmukoita voidaan nimetä sisäkkäisten rakenteiden selkeää hallintaa varten.

  • 🔁 Tarkoitus: Silmukka suorittaa koodilohkon monta kertaa, mikä vähentää koodin kokoa ja monimutkaisuutta.
  • 🧭 Silmukkalaskuri: Laskurimuuttuja määrittää silmukan ehdon ja sen täytyy muuttua, jotta silmukka voi poistua.
  • ⏭️ JATKAA: Ohittaa nykyisen iteraation loppuosan ja aloittaa seuraavan.
  • 🚪 ULOSKÄYNTI / ULOSKÄYNTI KUN: Poistuu silmukasta välittömästi, valinnaisesti, kun totuusarvoinen ehto on tosi.
  • 🏷️ Labels: Silmukan otsikko kaksoiskulmasulkeissa antaa EXIT-funktion kohdistaa ulompaan silmukkaan.
  • ♾️ Perussilmukka: Suoritetaan, kunnes saavutetaan eksplisiittinen ULOSKÄYNTI; ilman sitä se jatkuu loputtomiin.
  • 🧩 Kolme tyyppiä: Perussilmukka, FOR-silmukka ja WHILE-silmukka kattavat yleisimmät mallit.

Oracle PL/SQL-silmukka

Mitä Loopit ovat?

Silmukat mahdollistavat tietyn osan koodista suorittamisen ohjelmassa halutun määrän kertoja. Tässä opetusohjelmassa tarkastelemme silmukkakonseptia PL/SQL:ssä ja ohjauksen kulkua silmukoissa.

Johdatus silmukoiden konseptiin

Silmukkakonsepti tarjoaa seuraavat edut koodauksessa:

  • Koodin uudelleenkäytettävyys.
  • Pienennetty koodin koko.
  • Helppo ohjauksen kulku.
  • Vähemmän monimutkaisuutta.

Alla oleva kaavio näyttää vessanping konsepti.

Vessaping käsitevirta PL/SQL:ssä

Yllä olevassa kaaviossa silmukan ehto tarkistetaan, ja niin kauan kuin se täyttyy, suorituslohko suoritetaan.

Jokaisella iteraatiolla silmukan laskurimuuttuja, joka määrittää silmukan ehdon, muuttuu, jotta ohjaus poistuu silmukasta. Joissakin tapauksissa tämä laskuri on ennalta määritetyn laskurin lisäys tai vähennys, ja toisissa se on hakuehto, joka suorittaa lohkoa, kunnes se täyttyy.

Silmukkaohjauslausekkeet

Ennen silmukoiden käsitteen oppimista on tärkeää oppia silmukan ohjauslausekkeet. Nämä lauseet ohjaavat suorituksen kulkua silmukan sisällä.

JATKA

Tämä avainsana ohjeistaa PL/SQL-moottoria, että aina kun se kohtaa CONTINUE-käskyn silmukan sisällä, se ohittaa jäljellä olevan koodin suorituslohkossa ja aloittaa seuraavan iteraation välittömästi. Tätä käytetään pääasiassa silloin, kun silmukan sisällä oleva koodi tulisi ohittaa tietyillä iteraatioarvoilla.

POISTU / POISTU KUN

Tämä avainsana käskee PL/SQL-moottoria poistumaan välittömästi nykyisestä silmukasta. Sisäkkäisessä silmukassa sisemmän silmukan EXIT-komento poistuu vain sisemmästä silmukasta, ei ulommasta silmukasta. 'EXIT WHEN' -komentoa seuraa lauseke, joka antaa totuusarvon mukaisen tuloksen; jos tulos on TRUE, ohjaus poistuu.

GOTO

Tämä lauseke siirtää ohjauksen nimetylle lausekkeelle ("GOTO ;"). Sillä on seuraavat rajoitukset:

  • Ohjauksen siirto voidaan tehdä vain aliohjelmien sisällä.
  • Ohjauksen siirtoa ei voida tehdä poikkeusten käsittelyosasta suoritusosaan.

Tämän lausekkeen käyttöä ei suositella, ellei vaihtoehtoa ole, koska koodin ohjausobjekti tracHallinta vaikeutuu huomattavasti, kun se siirtyy osasta toiseen.

Silmukan tyypit PL/SQL:ssä

PL / SQL tarjoaa seuraavat kolme silmukkatyyppiä:

Alla oleva taulukko vertailee näitä kolmea ennen kuin perussilmukka käsitellään yksityiskohtaisesti.

Silmukka Poistumiskriteerit Parhaimmillaan käyttää, kun
Perussilmukka Eksplisiittinen ULOSKÄYNTI korttelissa Poistuminen ei perustu kiinteään määrään tai ehtoon
FOR silmukkaa Laskuri saavuttaa mittausalueensa rajan Iteraatioiden määrä tiedetään etukäteen
WHILE-silmukka Ehto muuttuu vääräksi Silmukan tulisi toimia niin kauan kuin ehto on voimassa

Silmukan peruslauseke

Tämä on PL/SQL:n yksinkertaisin silmukkarakenne. Suorituslohko alkaa avainsanalla 'LOOP' ja päättyy avainsanaan 'END LOOP'. Poistumisehto tulee antaa suorituslohkon sisällä, jotta ohjaus poistuu silmukasta, ja EXIT-avainsana on annettava eksplisiittisesti.

PL/SQL:n perussilmukkarakenne

LOOP
<execution block starts>
<EXIT condition based on developer criteria>
<execution_block_ends>
END LOOP;

Syntaksiselitys:

  • Avainsana 'LOOP' merkitsee silmukan alkua ja 'END LOOP' sen loppua.
  • Suorituslohko sisältää kaiken suoritettavan koodin, mukaan lukien EXIT-ehdon.
  • Suoritusosa voi sisältää minkä tahansa suoritettavan lausekkeen.

Huomautus: Perussilmukkalauseke ilman EXIT-avainsanaa on ikuinen silmukka, joka ei koskaan pysähdy.

Esimerkki 1: Tässä esimerkissä tulostamme numerot 1-5 käyttämällä yksinkertaista silmukkalausetta.

Perussilmukkatulostusnumerot 1–5

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

Code Selitys:

  • Code rivi 2: Muuttujan 'a' määrittäminen muotoon 'NUMBER' ja sen alustaminen arvolla '1'.
  • Code rivi 4: Tulostaa lausekkeen ”Ohjelma käynnistynyt”.
  • Code rivi 5: Avainsana 'LOOP' merkitsee silmukan alkua.
  • Code rivi 6: Tulostaa a:n arvon.
  • Code rivi 7: Kasvattaa 'a':n arvoa yhdellä.
  • Code rivi 8: Tarkistaa, onko 'a':n arvo suurempi kuin 5.
  • Code rivi 9: Avainsana 'END LOOP' merkitsee suorituslohkon loppua.
  • Rivit 6–8 jatkuvat, kunnes 'a' saavuttaa luvun 6, jolloin ehto palauttaa arvon TRUE ja ohjaus poistuu silmukasta.
  • Code rivi 10: Tulostaa ilmoituksen ”Ohjelma valmis”.

Silmukoiden merkitseminen

PL/SQL:ssä silmukoille voidaan antaa nimikkeet. Nimikkeen tulisi olla merkkien "<<" ja ">>" välissä. Silmukoiden nimeäminen, erityisesti sisäkkäisissä silmukoissa, parantaa luettavuutta. Nimikkeen voi antaa EXIT-komennossa kyseisen silmukan poistumiseksi, jolloin ohjaus voi poistua sisäkkäisen rakenteen ulommasta silmukasta suoraan antamalla EXIT-komennon ja sen jälkeen ulomman silmukan nimikkeen.

Merkitty sisäkkäinen silmukkarakenne

<<OUTER_LOOP>>
LOOP
<execution_block_starts>
.
<<INNER_LOOP>>
LOOP --inner
<execution_part>
END LOOP;
.
<execution_block_ends>
END LOOP;

Syntaksiselitys:

  • Ulommassa silmukassa on yksi silmukka lisää sisällään.
  • '< >' ja '< >' ovat näiden silmukoiden tunnisteet.

Esimerkki 1: Tässä esimerkissä tulostamme numeroita alkaen 1:stä käyttämällä yksinkertaista silmukkalausetta. Jokainen luku tulostetaan niin monta kertaa kuin sen arvo on. Sarjan yläraja on kiinteä deklarointiosassa. Käytämme tätä varten label-konseptia.

Merkitty silmukkaesimerkki, osa 1Merkitty silmukkaesimerkki, osa 2

DECLARE
a NUMBER:= 0;
b NUMBER;
upper_limit NUMBER := 4;
BEGIN
dbms_output.put_line('Program started.');
<<outer_loop>>
LOOP
a:= a+1;
b:= 1;
<<inner_loop>>
LOOP
EXIT outer_loop WHEN a > upper_limit;
dbms_output.put_line(a);
b:= b+1;
EXIT inner_loop WHEN b>a;
END LOOP;
END LOOP;
dbms_output.put_line('Program completed.');
END;
/

Code Selitys:

  • Code rivi 2–3: Muuttujien 'a' ja 'b' määrittäminen 'NUMBER'-tietotyypeiksi.
  • Code rivi 4: Muuttujan 'upper_limit' määrittäminen arvoksi 'NUMBER' arvolla '4'.
  • Code rivi 6: Tulostaa lausekkeen ”Ohjelma käynnistynyt”.
  • Code rivi 7: Ulompi silmukka on merkitty nimellä ”outer_loop”.
  • Code rivi 9: 'a':n arvoa kasvatetaan yhdellä.
  • Code rivi 11: Sisäinen silmukka on merkitty nimellä ”sisäinen_silmukka”.
  • Code rivi 13: POISTUMISehto, joka tarkistaa, onko 'a' suurempi kuin 'upper_limit'-arvo. Jos ei, se jatkaa pidemmälle; muuten se poistuu suoraan ulommasta silmukasta.
  • Code rivi 14: 'b':n arvon tulostaminen.
  • Code rivi 15: Kasvattaa 'b':n arvoa yhdellä.
  • Code rivi 16: POISTUMIS-ehto, joka tarkistaa, onko 'b' suurempi kuin 'a'. Jos on, se poistuu sisemmästä silmukasta.
  • Code rivi 19: Tulostaa ilmoituksen ”Ohjelma valmis”.

UKK

EXIT poistuu silmukasta ehdoitta. EXIT WHEN poistuu silmukasta vain, kun seuraava totuusarvolauseke on tosi, mikä poistaa tarpeen erilliselle JOS-lausekkeelle tavallisen EXIT-lausekkeen ympärillä.

Nimike antaa sisemmän silmukan EXIT-käskyn poistua nimetystä ulommasta silmukasta yhdessä vaiheessa. Se tekee myös sisäkkäisestä koodista paljon helpommin luettavaa kuin tracking plain END LOOP -lausekkeet.

Jos lohkolla ei ole EXIT-ehtoa tai laskuri ei koskaan saavuta lopetusehtoa, silmukka ei pysähdy koskaan. Varmista aina, että laskuri muuttuu kohti EXIT WHEN -ehtoa.

Usein kyllä. Tekoäly voi trace liikkuuko laskuri kohti EXIT-ehtoa ja varoittaako, kun silmukalla ei ole saavutettavissa olevaa poistumispistettä, vaikka datasta riippuva poistumispiste vaatii silti testiajon vahvistusta varten.

CONTINUE ohittaa nykyisen iteraation loppuosan ja hyppää seuraavaan. Se on hyödyllinen, kun tietyt arvot halutaan jättää huomiotta poistumatta silmukasta kokonaan.

Tiivistä tämä viesti seuraavasti: