De FOR-lus

De FOR-lus is misschien wel de belangrijkste lus die in PL/pgSQL is geïmplementeerd. Gebruik De for-lus om een statementsblok te herhalen over een reeks gehele getallen die u opgeeft. De structuur van een for lus in PL/pgSQL is vergelijkbaar met die van loops in andere procedurele talen, zoals C.

in een PL/pgSQL voor lus wordt eerst een integer variabele vermeld, om de ITER van de lus te volgen, dan wordt het gehele bereik gegeven, en ten slotte wordt een statementsblok gegeven. De integer variabele die is gecreëerd om de iteratie van de lus te volgen, wordt vernietigd zodra de lus wordt afgesloten; het hoeft niet te worden gedeclareerd in de declaratiesectie van het blok. Het volgende toont de syntaxis van de FOR-lus:

 FOR identifier IN expression1 .. expression2 LOOP statement; END LOOP;

De FOR-lus zal een enkele iteratie uitvoeren voor elke verhoogde waarde vanidentifier die binnen het bereik van waarden tussen, en met inbegrip van, expression1 en expression2 ligt. De identifier waarde zal worden geïnitialiseerd naar de waarde van expression1, ongeacht eventuele eerdere instellingen, en verhoogd met één elke iteratie. Als reverse is opgegeven, wordt de identifier minder gedecentreerd dan verhoogd.

opmerking: de identificatie die wordt gebruikt om iteratie te volgen hoeft niet buiten het For-blok te worden gedeclareerd, tenzij u de waarde ervan wilt kunnen benaderen nadat de lus is beëindigd.

De FOR-lus kan ook worden gebruikt om de resultaten van een query door te bladeren. De tweede voor lus in Voorbeeld 11-45 demonstreert het gebruik van een lus om te werken met RECORD en%ROWTYPE variabelen. De syntaxis van A Voor lus die via RECORD en %ROWTYPE variabelen wordt weergegeven in de volgende syntaxis:

 FOR { record_variable | %rowtype_variable } IN select_statement LOOP statement; END LOOP;

in Voorbeeld 11-45 wordt de functie extract_all_titles () gebruikt om een lijst van alle boektitels uit de database te extraheren, georganiseerd op onderwerp. Wanneer een onderwerp geen boektitels heeft, wordt een regel weergegeven. De lijst wordt geretourneerd als een tekstvariabele. A Voor lus isutilized binnen de extract_all_titles () functie om door de beschikbaarsubjects op nummer te bladeren.

een andere FOR-lus is genest in de oorspronkelijke lus om door de beschikbare boeken te bladeren en alle boeken op te halen met subject_id-waarden die overeenkomen met de oorspronkelijke lus ‘ siteration-variabele, die het huidige onderwerp-ID-nummer vertegenwoordigt waarnaar de functie scant. In Voorbeeld 11-45 wordt de iteratievariabele i geïnitialiseerd naar nul omdat het eerste ID-nummer van het onderwerp in onze onderwerptabel 0 is.

voorbeeld 11-46 toont de code van een andere functie die een lus gebruikt om de resultaten van een SQL-query te herhalen. Bij elke iteratie van de loopthe FOR loop in Voorbeeld 11-46 plaatst de inhoud van een resultaatrij uit een query tegen de boekentabel in de row_data variabele en voegt vervolgens de waarde van het titelveld van de rij in de text_output variabele.

de lus eindigt wanneer de laatste record in boeken is bereikt. Aan het einde van de lus bevat text_output een lijst met alle boektitels die overeenkomen met het onderwerp-ID-nummer dat aan de functie is doorgegeven. De text_output variabele wordt geretourneerd aan het einde van de functie.

voorbeeld 11-47 toont de resultaten van de functieextract_title() wanneer 2, dat”kinderboeken” in de onderwerptabel vertegenwoordigt, als argument wordt doorgegeven.

de variabele row_data wordt gedeclareerd als een % Rowtypevan de boekentabel, omdat deze alleen zal worden gebruikt om records uit de boekentabel vast te houden. We hadden row_data kunnen gedeclareerd hebben als aRECORD om hetzelfde resultaat te bereiken, maar het RECORDtype zou gebruikt moeten worden wanneer je de variabele gaat gebruiken voor meer dan alleen de rijen van één specifieke tabel:

row_data RECORD;

de functie extract_title () retourneert dezelfde resultaten, ongeacht of rijgegevens als RECORD worden gedeclareerd of gedeclareerd met%ROWTYPE.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.