Oracle PL/SQL LOOP med exempel

⚡ Smart sammanfattning

PL/SQL-loopar exekverar en del kod upprepade gånger ett önskat antal gånger. PL/SQL erbjuder grundläggande FOR- och WHILE-loopar, styrda av CONTINUE, EXIT, EXIT WHEN och GOTO, och loopar kan märkas för att hantera kapslade strukturer på ett tydligt sätt.

  • 🔁 Syfte: En loop kör ett kodblock många gånger, vilket minskar kodens storlek och komplexitet.
  • 🧭 Loopräknare: En räknarvariabel bestämmer loopvillkoret och måste ändras för att loopen ska kunna avslutas.
  • ⏭️ FORTSÄTTA: Hoppar över resten av den aktuella iterationen och startar nästa.
  • 🚪 UTGÅNG / UTGÅNG NÄR: Lämnar loopen omedelbart, valfritt när ett booleskt villkor är sant.
  • 🏷️ Returfrakt och etiketter: En loopetikett mellan dubbla vinkelparenteser låter EXIT rikta in sig på en yttre loop.
  • ♾️ Grundslinga: Körs tills en explicit UTGÅNG nås; utan en loopas den i evigheter.
  • 🧩 Tre typer: Grundloop, FOR-loop och WHILE-loop täcker de vanliga mönstren.

Oracle PL/SQL-loop

Vad är loopar?

Loopar gör det möjligt att köra en viss del av koden i ett program önskat antal gånger. I den här handledningen tittar vi på loopkonceptet i PL/SQL och kontrollflödet i loopar.

Introduktion till loopkonceptet

Loopkonceptet ger följande fördelar inom kodning:

  • Återanvändbarhet av kod.
  • Minskad kodstorlek.
  • Enkelt kontrollflöde.
  • Minskad komplexitet.

Diagrammet nedan visar toalettenping begrepp.

Looping konceptflöde i PL/SQL

I diagrammet ovan kontrolleras loopvillkoret, och så länge det är uppfyllt körs exekveringsblocket.

I varje iteration bör loopräknarvariabeln som bestämmer loopvillkoret ändras för att kontrollen ska lämna loopen. I vissa fall är denna räknare en ökning eller minskning för ett fördefinierat antal, och i andra fall är det ett sökvillkor som fortsätter att exekvera blocket tills det är uppfyllt.

Uttryck för slingkontroll

Innan man lär sig loopkonceptet är det viktigt att lära sig loopkontrollsatserna. Dessa satser styr exekveringsflödet inuti en loop.

FORTSÄTTA

Detta nyckelord instruerar PL/SQL-motorn att när den stöter på CONTINUE i en loop, hoppar den över den återstående koden i exekveringsblocket och startar nästa iteration omedelbart. Detta används främst när koden inuti loopen ska hoppas över för vissa iterationsvärden.

AVSLUTA / AVSLUTA NÄR

Detta nyckelord instruerar PL/SQL-motorn att omedelbart avsluta den aktuella loopen. I en kapslad loop avslutar EXIT i den inre loopen endast den inre loopen, inte den yttre loopen. 'EXIT WHEN' följs av ett uttryck som ger ett booleskt resultat; om resultatet är TRUE avslutas kontrollen.

GOTO

Denna sats överför kontrollen till en etiketterad sats ("GOTO ;"). Den har följande begränsningar:

  • Överföring av kontroll kan endast göras inom underprogrammen.
  • Kontrollöverföring kan inte göras från undantagshanteringsdelen till exekveringsdelen.

Användning av detta uttalande rekommenderas inte om det inte finns något alternativ, eftersom kodkontrollen tracDet blir mycket svårt att uppnå effektivitet när kontrollen överförs från en del till en annan.

Typer av loopar i PL/SQL

PL / SQL erbjuder följande tre typer av loopar:

Tabellen nedan jämför de tre innan den grundläggande loopen behandlas i detalj.

loop Utgångskriterier Bäst att använda när
Grundslinga Explicit UTGÅNG i blocket Utgången är inte baserad på ett fast antal eller villkor
FÖR slinga Räknaren når sitt intervallände Antalet iterationer är känt i förväg
WHILE-slinga Villkoret blir falskt Loopen ska köras medan ett villkor gäller

Grundläggande loop Statement

Detta är den enklaste loopstrukturen i PL/SQL. Exekveringsblocket börjar med nyckelordet 'LOOP' och slutar med 'END LOOP'. Avslutningsvillkoret bör anges inuti exekveringsblocket så att kontrollen lämnar loopen, och nyckelordet EXIT måste anges explicit.

Grundläggande loopstruktur i PL/SQL

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

Syntaxförklaring:

  • Nyckelordet 'LOOP' markerar början på loopen och 'END LOOP' markerar slutet.
  • Exekveringsblocket innehåller all kod som behöver köras, inklusive EXIT-villkoret.
  • Exekveringsdelen kan innehålla vilken körbar sats som helst.

Obs: En grundläggande loop-sats utan EXIT-nyckelord är en oändlig loop som aldrig slutar.

Exempel 1: I det här exemplet skriver vi ut tal från 1 till 5 med hjälp av en enkel loop-sats.

Grundläggande looputskriftsnummer 1 till 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 Förklaring:

  • Code rad 2: Deklarera variabeln 'a' som 'NUMBER' och initiera den med värdet '1'.
  • Code rad 4: Skriver ut meddelandet ”Programmet startade”.
  • Code rad 5: Nyckelordet 'LOOP' markerar början på loopen.
  • Code rad 6: Skriver ut värdet på 'a'.
  • Code rad 7: Ökar värdet på 'a' med 1.
  • Code rad 8: Kontrollerar om värdet på "a" är större än 5.
  • Code rad 9: Nyckelordet 'END LOOP' markerar slutet på exekveringsblocket.
  • Raderna 6 till 8 fortsätter att köras tills 'a' når 6, då villkoret returnerar SANT och kontrollen avslutar loopen.
  • Code rad 10: Skriver ut meddelandet ”Program slutfört”.

Märkning av loopar

I PL/SQL kan loopar märkas. Etiketten bör omges mellan "<<" och ">>". Att märka loopar, särskilt i kapslade loopar, ger större läsbarhet. Etiketten kan ges i ett EXIT-kommando för att avsluta den specifika loopen, så att kontrollen kan avsluta den yttre loopen av en kapslad struktur direkt genom att ge EXIT-kommandot följt av den yttre loop-etiketten.

Märkt kapslad loopstruktur

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

Syntaxförklaring:

  • Den yttre slingan har ytterligare en slinga inuti.
  • '< >' och '< >' är etiketterna för dessa loopar.

Exempel 1: I det här exemplet skriver vi ut tal som börjar från 1 med hjälp av en enkel loop-sats. Varje tal skrivs ut lika många gånger som dess värde. Seriens övre gräns är fastställd i deklarationsdelen. Vi använder etikettkonceptet för att uppnå detta.

Exempel på märkt loop del 1Exempel på märkt loop del 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 Förklaring:

  • Code rad 2-3: Deklarerar variablerna 'a' och 'b' som datatyperna 'NUMBER'.
  • Code rad 4: Deklarerar variabeln 'upper_limit' som 'NUMBER' med värdet '4'.
  • Code rad 6: Skriver ut meddelandet ”Programmet startade”.
  • Code rad 7: Den yttre loopen är märkt "outer_loop".
  • Code rad 9: Värdet på "a" ökas med 1.
  • Code rad 11: Den inre loopen är märkt "inner_loop".
  • Code rad 13: EXIT-villkor som kontrollerar om 'a' är högre än värdet 'upper_limit'. Om inte, går det vidare; annars lämnar det den yttre loopen direkt.
  • Code rad 14: Skriver ut värdet på 'b'.
  • Code rad 15: Ökar värdet på 'b' med 1.
  • Code rad 16: EXIT-villkor som kontrollerar om 'b' är högre än 'a'. Om så är fallet lämnar den den inre loopen.
  • Code rad 19: Skriver ut meddelandet ”Program slutfört”.

Vanliga frågor

EXIT lämnar loopen villkorslöst. EXIT WHEN lämnar den endast när följande booleska uttryck är sant, vilket eliminerar behovet av en separat IF runt en vanlig EXIT.

En etikett låter en EXIT i en inre loop lämna en namngiven yttre loop i ett steg. Det gör också kapslad kod mycket lättare att läsa än trackung vanliga END LOOP-satser.

Om blocket inte har någon UTGÅNG, eller om räknaren aldrig når utgångsvillkoret, stannar loopen aldrig. Se alltid till att räknaren ändrar sig mot EXIT NHEN-villkoret.

Ofta, ja. AI kan trace om räknaren rör sig mot EXIT-villkoret och varnar när en loop inte har någon nåbar utgång, även om en databeroende utgång fortfarande behöver en testkörning för att bekräfta.

CONTINUE hoppar över resten av den aktuella iterationen och går vidare till nästa. Det är användbart när vissa värden ska ignoreras utan att helt lämna loopen.

Sammanfatta detta inlägg med: