Die FOR-Schleife

Die FOR-Schleife ist wohl die wichtigste in PL / pgSQL implementierte Schleife. Verwenden Sie theFOR Schleife, um einen Anweisungsblock über einen Bereich von Ganzzahlen zu iterieren, die Sie angeben. Die Struktur einer FOR-Schleife in PL / pgSQL ähnelt FORloops in anderen prozeduralen Sprachen wie C.

In einer PL / pgSQL-FOR-Schleife wird zuerst eine ganzzahlige Variable angegeben, um die Iteration der Schleife zu verfolgen, dann wird der ganzzahlige Bereich angegeben und schließlich ein Anweisungsblock bereitgestellt. Die Integer-Variable, die erstellt wurde, um die Iteration der Schleife zu verfolgen, wird zerstört, sobald die Schleife beendet wird. Im Folgenden wird die Syntax der FOR-Schleife gezeigt:

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

Die FOR-Schleife führt eine einzelne Iteration für jeden inkrementierten Wert von identifier durch, der im Wertebereich zwischen und einschließlich Ausdruck1 und Ausdruck2 liegt. Der Bezeichnerwert wird unabhängig von vorherigen Einstellungen auf den Wert ofexpression1 initialisiert und bei jeder Iteration um eins erhöht. Wenn Reverse angegeben ist, wird die Kennung dekrementiert und nicht inkrementiert.

Hinweis: Der Bezeichner, der zum Verfolgen der Iteration verwendet wird, muss nicht außerhalb des For Blocks deklariert werden, es sei denn, Sie möchten nach Abschluss der Schleife auf seinen Wert zugreifen können.

Die FOR-Schleife kann auch verwendet werden, um die Ergebnisse einer Abfrage zu durchlaufen. Die Zweite FOR-Schleife in Beispiel 11-45 zeigt die Verwendung einer FOR-Schleife zum Arbeiten mit den Variablen RECORD und%ROWTYPE. Die Syntax einer FOR-Schleife, die durch die Variablen RECORD und %ROWTYPE wechselt, wird in der folgenden Syntax angezeigt:

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

In Beispiel 11-45 wird die Funktion extract_all_titles() verwendet, um eine Liste aller in der Datenbank vorhandenen Buchtitel nach Themen zu extrahieren. Wenn ein Thema keine Buchtitel hat, ablank Linie wird angezeigt. Die Liste wird als Textvariable zurückgegeben. In der Funktion extract_all_titles () wird eine FOR-Schleife verwendet, um die verfügbaren Objekte nach Nummer zu durchsuchen.

Eine weitere FOR-Schleife ist in der ursprünglichen Schleife verschachtelt, um die verfügbaren Bücher zu durchlaufen und alle Bücher mit subject_id-Werten abzurufen, die mit der Originalschleifeniterationsvariablen übereinstimmen, die die aktuelle Betreff-ID-Nummer darstellt, nach der die Funktion sucht. In Beispiel 11-45 wird die Iterationsvariable i auf Null initialisiert, da die erste Subjekt-ID-Nummer in unserer Subjects-Tabelle 0 ist.

Beispiel 11-46 zeigt den Code einer anderen Funktion, die eine FOR-Schleife verwendet, um die Ergebnisse einer SQL-Abfrage zu durchlaufen. Bei jeder Iteration der Schleife platziert die FOR-Schleife in Beispiel 11-46 den Inhalt einer Ergebniszeile aus einer Abfrage für die books-Tabelle in die row_data-Variable und fügt dann den Wert des title-Felds der Zeile in die text_output-Variable ein.

Die Schleife endet, wenn der letzte Datensatz in Büchern erreicht ist. Am Ende der Schleife enthält text_output eine Liste aller Buchtitel, die mit der an die Funktion übergebenen Betreff-ID-Nummer übereinstimmen. Die Variable text_output wird am Ende der Funktion zurückgegeben.

Beispiel 11-47 zeigt die Ergebnisse der Funktion extract_title(), wenn 2, die „Kinderbücher“ in der Subject-Tabelle darstellt, als Argument übergeben wird.

Die Variable row_data wird als %ROWTYPEof der Tabelle books deklariert, da sie nur zum Speichern von Datensätzen aus der Tabelle books verwendet wird. Wir hätten row_data als aRECORD deklarieren können, um dasselbe Ergebnis zu erzielen, aber der RecordType sollte verwendet werden, wenn Sie die Variable für mehr als nur die Zeilen einer bestimmten Tabelle verwenden:

row_data RECORD;

Die Funktion extract_title() gibt die gleichen Ergebnisse zurück, unabhängig davon, ob Zeilendaten als DATENSATZ deklariert oder mit%ROWTYPE deklariert wurden.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.