<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=PL%2FpgSQL</id>
	<title>PL/pgSQL - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=PL%2FpgSQL"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=PL/pgSQL&amp;action=history"/>
	<updated>2026-05-17T09:00:15Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=PL/pgSQL&amp;diff=1902298&amp;oldid=prev</id>
		<title>imported&gt;Thomas Dresler: Kommasetzung</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=PL/pgSQL&amp;diff=1902298&amp;oldid=prev"/>
		<updated>2024-03-16T07:53:16Z</updated>

		<summary type="html">&lt;p&gt;Kommasetzung&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Infobox Programmiersprache&lt;br /&gt;
| Name                         = PL/pgSQL&lt;br /&gt;
| Logo                         = [[Datei:Postgresql.png|zentriert]]&lt;br /&gt;
| Beschreibung                 = Prozedurale Erweiterung von [[SQL]]&lt;br /&gt;
| Paradigma                    = prozedural&lt;br /&gt;
| Entwickler                   = [https://www.postgresql.org/community/contributors/ PostgreSQL-Team]&lt;br /&gt;
| AktuelleVersion              = 12&lt;br /&gt;
| AktuelleVersionFreigabeDatum = 3.&amp;amp;nbsp;Oktober&amp;amp;nbsp;2019&lt;br /&gt;
| Typisierung                  = [[Starke Typisierung|stark]], [[Statische Typisierung|statisch]], [[Explizite Typisierung|explizit]]&lt;br /&gt;
| Betriebssystem               = [[Unix-Derivat]]e, [[Linux]], [[Microsoft Windows|Windows]]&lt;br /&gt;
| Lizenz                       = PostgreSQL Lizenz&amp;lt;ref&amp;gt;[https://www.postgresql.org/about/licence/ &amp;#039;&amp;#039;PostgreSQL: License&amp;#039;&amp;#039;] – Seite bei &amp;#039;&amp;#039;PostgreSQL.org&amp;#039;&amp;#039;; Stand: 17.&amp;amp;nbsp;September 2011 (englisch).&amp;lt;/ref&amp;gt;&lt;br /&gt;
| Website= [https://www.postgresql.org/ postgresql.org]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;PL/pgSQL&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;&amp;#039;Procedural Language/PostgreSQL Structured Query Language&amp;#039;&amp;#039;&amp;#039;) ist eine prozedurale Sprache der [[Objektrelationale Datenbank|objektrelationalen Datenbank]] [[PostgreSQL]]. Die Syntax von PL/pgSQL ist wie bei [[PL/SQL]] auf [[Oracle]]-Datenbanksystemen stark an [[Ada (Programmiersprache)|Ada]] angelehnt.&lt;br /&gt;
&lt;br /&gt;
PL/pgSQL wurde zur Erweiterung des SQL-Funktionsumfangs eingeführt, dabei kann PL/pgSQL-Code als [[Stored Procedure]] in der Datenbank selbst gespeichert sein. Unterstützt werden [[Variable (Programmierung)|Variablen]], [[Verzweigung (Programmierung)|Bedingungen]], [[Schleife (Programmierung)|Schleifen]], [[Funktion (Programmierung)|Funktionen]], Datenbankcursor und [[Ausnahmebehandlung]]en. PL/pgSQL-Code kann sowohl aus SQL-Kommandos als auch aus [[Datenbanktrigger]]n heraus aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe der prozeduralen Erweiterung lassen sich SQL-Befehle direkt im PostgreSQL-Server dynamisch erzeugen und müssen nicht mehr als Text über eine Datenbankschnittstelle übergeben werden, wie dies z.&amp;amp;nbsp;B. bei [[Open Database Connectivity|ODBC]], [[Java Database Connectivity|JDBC]] und [[OLE DB]] der Fall ist, sondern können direkt in der Datenbank erstellt und ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
== Verwendung ==&lt;br /&gt;
* PL/pgSQL-Code kann von einem [[Frontend und Backend|Datenbank-Frontend]] an PostgreSQL übergeben und dort direkt abgearbeitet werden.&lt;br /&gt;
* PL/pgSQL-Code kann (als [[Stored Procedure]]) dauerhaft in der Datenbank gespeichert werden um den Funktionsumfang der Datenbank zu erweitern.&lt;br /&gt;
* Über Berechtigungen (sogenannte „Rollen“) kann jeder Benutzer oder jede Benutzergruppe der Datenbank die Funktionen nutzen, die für deren Rolle vorgesehen sind. Auf diese Weise lässt sich die Sicherheit vor unbefugten Zugriffen deutlich verbessern.&lt;br /&gt;
* Verwendung in [[Datenbanktrigger]]n&lt;br /&gt;
* Die Performance lässt sich oft enorm steigern, wenn PL/pgSQL-Programme direkt in der Datenbank ausgeführt werden, insbesondere wenn sich dadurch die Kommunikation zwischen Prozessen oder der Netzwerkverkehr, falls Datenbank und Anwendungsserver auf unterschiedlicher Hardware ausgeführt werden, vermeiden lässt.&lt;br /&gt;
&lt;br /&gt;
== Grundlegender Aufbau ==&lt;br /&gt;
PL/pgSQL-Programme bestehen aus Blöcken:&lt;br /&gt;
&amp;lt;ref&amp;gt;{{Internetquelle |url=https://www.postgresql.org/docs/current/plpgsql-structure.html |titel=PostgreSQL 9.1.0 Documentation, PL/pgSQL - SQL  Procedural Language, Structure of PL/pgSQL |zugriff=2011-09-17 |hrsg=PostgreSQL.org |datum=2011-09-12 |sprache=en}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;postgresql&amp;quot;&amp;gt;&lt;br /&gt;
DECLARE&lt;br /&gt;
  -- Deklarationsblock&lt;br /&gt;
  -- Der DECLARE Abschnitt ist optional&lt;br /&gt;
BEGIN&lt;br /&gt;
  -- Ausführungsteil&lt;br /&gt;
EXCEPTION&lt;br /&gt;
  -- Ausnahmeverarbeitung&lt;br /&gt;
  -- Der EXCEPTION Abschnitt ist optional&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
Das Beispiel schreibt eine &amp;quot;Hallo Welt&amp;quot;-Notiz.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;postgresql&amp;quot;&amp;gt;&lt;br /&gt;
-- Eine Funktion namens hallo wird angelegt.&lt;br /&gt;
-- &amp;quot;void&amp;quot; bedeutet, dass nichts zurückgegeben wird.&lt;br /&gt;
CREATE OR REPLACE FUNCTION  hallo() RETURNS void AS&lt;br /&gt;
  -- Der Funktionskörper wird in $$-Stringliteralen gekapselt.&lt;br /&gt;
  -- hier steht $body$ zwischen den $ Zeichen.&lt;br /&gt;
  -- Der Text zwischen den $ Zeichen muss eine Länge von mindestens 0 Zeichen aufweisen.&lt;br /&gt;
  $body$&lt;br /&gt;
    BEGIN&lt;br /&gt;
      RAISE NOTICE  &amp;#039;Hallo Welt&amp;#039;; -- eine Notiz wird aufgerufen&lt;br /&gt;
    END;&lt;br /&gt;
  $body$ -- Ende des Funktionskörpers&lt;br /&gt;
LANGUAGE plpgsql; -- die Sprache des Funktionskörpers muss angegeben werden&lt;br /&gt;
&lt;br /&gt;
SELECT hallo();&lt;br /&gt;
 -- Die Funktion wird mit einem SELECT aufgerufen.&lt;br /&gt;
 -- Die Ausgabe der Notiz erfolgt in der Konsole&lt;br /&gt;
&lt;br /&gt;
DROP FUNCTION hallo();&lt;br /&gt;
-- Löschen (&amp;quot;droppen&amp;quot;) der Funktion, die wir gerade angelegt haben.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;!-- das Syntaxhighlight von PostgreSQL sollte verbessert werden.&lt;br /&gt;
     Mehrzeilige Kommentare sind derzeit nicht möglich.&lt;br /&gt;
     Die Liste der reservierten Wörter ist unvollständig.&lt;br /&gt;
     --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Variablendefinitionen ==&lt;br /&gt;
Variablen werden im optionalen Abschnitt &amp;lt;code&amp;gt;DECLARE&amp;lt;/code&amp;gt; definiert und optional initialisiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;postgresql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE FUNCTION foo() RETURNS void AS&lt;br /&gt;
$BODY$&lt;br /&gt;
  DECLARE&lt;br /&gt;
      zahl_antwort INTEGER;&lt;br /&gt;
      zahl_lösung INTEGER := 42;&lt;br /&gt;
  BEGIN&lt;br /&gt;
    zahl_antwort := zahl_lösung;&lt;br /&gt;
    RAISE NOTICE  &amp;#039;Die Antwort lautet %.&amp;#039;, zahl_antwort;-- % wird durch die Variable ersetzt&lt;br /&gt;
    -- return true;&lt;br /&gt;
  END;&lt;br /&gt;
$BODY$ LANGUAGE plpgsql;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;:=&amp;lt;/code&amp;gt; ist der Zuweisungsoperator, mit dem man einer Variable einen Wert zuweist. Im DECLARE Abschnitt kann für Zuweisungen alternativ auch &amp;lt;code&amp;gt;DEFAULT&amp;lt;/code&amp;gt; verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=== Zahlenvariablen ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;postgresql&amp;quot;&amp;gt;&lt;br /&gt;
variablenname NUMERIC(precision, scale) DEFAULT wert;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um eine Zahlenvariable zu definieren, schreibt man den Variablennamen gefolgt vom Variablentyp &amp;lt;code&amp;gt;NUMERIC&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Hinter diesem schreibt man in runden Klammern die Genauigkeit precision sowie optional ein Komma und die Anzahl an Nachkommastellen scale. Gibt man &amp;lt;code&amp;gt;NUMERIC&amp;lt;/code&amp;gt; ohne Klammern an gelten für die Genauigkeit bis zu 131072 Stellen vor dem Dezimalpunkt und bis zu 16383 Stellen nach dem Dezimalpunkt.&lt;br /&gt;
&lt;br /&gt;
Genauigkeit entspricht in diesem Fall der Anzahl an Stellen, welche die Variable enthalten kann, und &amp;#039;&amp;#039;nicht&amp;#039;&amp;#039; dem Wertebereich.&lt;br /&gt;
&lt;br /&gt;
Auswahl weiterer Datentypen für Zahlenvariablen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;postgresql&amp;quot;&amp;gt;&lt;br /&gt;
SMALLINT, INTEGER, BIGINT, DECIMAL, REAL, DOUBLE PRECISION&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;!-- Bug Syntaxhighlight DOUBLE PRECISION --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Textvariablen ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;postgresql&amp;quot;&amp;gt;&lt;br /&gt;
variablenname1 VARCHAR(length) := &amp;#039;Text&amp;#039;;&lt;br /&gt;
VARCHAR(length) COLLATE collation_name;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um eine Textvariable zu definieren, schreibt man den Variablennamen gefolgt vom Variablentyp &amp;lt;code&amp;gt;VARCHAR&amp;lt;/code&amp;gt;.&lt;br /&gt;
Hinter diesem schreibt man die Anzahl der Zeichen, die in der Variable gespeichert werden können, in Klammern.&lt;br /&gt;
Soll die Textvariable nach sprach- oder benutzerdefinierten Kriterien sortiert werden, kann man das Schlüsselwort &amp;lt;code&amp;gt;COLLATE&amp;lt;/code&amp;gt; gefolgt vom Collationsname z.&amp;amp;nbsp;B. &amp;quot;en_US&amp;quot; verwenden.&lt;br /&gt;
Weiterer Datentypen für Textvariablen sind:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;postgresql&amp;quot;&amp;gt;&lt;br /&gt;
CHAR, TEXT&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Boolean ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;postgresql&amp;quot;&amp;gt;&lt;br /&gt;
variablenname BOOLEAN := TRUE;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kann &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;[[Nullwert|NULL]]&amp;lt;/code&amp;gt; sein.&lt;br /&gt;
&lt;br /&gt;
=== Datum und Uhrzeit ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;postgresql&amp;quot;&amp;gt;&lt;br /&gt;
variablenname DATE := TO_DATE( &amp;#039;01.01.2005&amp;#039; , &amp;#039;DD.MM.YYYY&amp;#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um eine Datumsvariable zu definieren schreibt man den Variablennamen gefolgt vom Variablentyp &amp;lt;code&amp;gt;DATE&amp;lt;/code&amp;gt;.&lt;br /&gt;
Zum Konvertieren von Datum und Uhrzeit stellt PostgreSQL eine Reihe von Funktionen zur Verfügung. Hier wurde &amp;lt;code&amp;gt;TO_DATE()&amp;lt;/code&amp;gt; verwendet. Diese Funktion wandelt den Text zwischen den ersten Hochkommas in ein Datum mit dem angegebenen Format zwischen den zweiten Hochkommas um. Weitere Datum- und Zeit-Datentypen sind:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;postgresql&amp;quot;&amp;gt;&lt;br /&gt;
TIMESTAMP [(p)] [ WITHOUT TIME ZONE ]&lt;br /&gt;
TIMESTAMP [(p)] WITH TIME ZONE&lt;br /&gt;
DATE&lt;br /&gt;
TIME [(p)] [ WITHOUT TIME ZONE ]&lt;br /&gt;
TIME [(p)] WITH TIME ZONE&lt;br /&gt;
INTERVAL [ FIELDS ] [(p)]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit dem optionalen Statement &amp;lt;code&amp;gt;(p)&amp;lt;/code&amp;gt; kann die Anzahl der Stellen der Sekundenbruchteile präzisiert werden.&lt;br /&gt;
&lt;br /&gt;
=== Datentyp über Tabelle oder Spalte festlegen ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;postgresql&amp;quot;&amp;gt;&lt;br /&gt;
Variablenname tabellenname%ROWTYPE;&lt;br /&gt;
Variablenname tabellenname.spaltenname%TYPE;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;%TYPE&amp;lt;/code&amp;gt; definiert eine Variable des Typs der angegebenen Spalte.&lt;br /&gt;
&amp;lt;code&amp;gt;%ROWTYPE&amp;lt;/code&amp;gt; definiert eine Variable des Typs der angegebenen Tabelle. Weil jede Tabelle in PostgreSQL implizit einen gleichnamigen Zeilentyp generiert, darf &amp;lt;code&amp;gt;%ROWTYPE&amp;lt;/code&amp;gt; auch weggelassen werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;postgresql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE FUNCTION foo() RETURNS void AS&lt;br /&gt;
$BODY$&lt;br /&gt;
  DECLARE&lt;br /&gt;
    t_row tab%ROWTYPE;&lt;br /&gt;
  BEGIN&lt;br /&gt;
    SELECT * INTO t_row FROM tab WHERE Z=1;&lt;br /&gt;
     RAISE NOTICE  &amp;#039;Y*4+Z*2= %.&amp;#039;, t_row.y *4+ t_row.z*2;&lt;br /&gt;
    /*return true;*/&lt;br /&gt;
  END;&lt;br /&gt;
$BODY$ LANGUAGE plpgsql;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Steuerung des Programmablaufs ==&lt;br /&gt;
=== Rückgabe der Funktion ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;postgresql&amp;quot;&amp;gt;&lt;br /&gt;
RETURN expression;&lt;br /&gt;
RETURN NEXT expression;&lt;br /&gt;
RETURN QUERY query;&lt;br /&gt;
RETURN QUERY EXECUTE command-string;&lt;br /&gt;
RETURN QUERY EXECUTE command-string USING expression;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;!-- syntaxhighlight Bug: QUERY wird nicht richtig formatiert --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit dem Schlüsselwort &amp;lt;code&amp;gt;RETURN&amp;lt;/code&amp;gt; wird die Rückgabe an die Funktion definiert. Soll die Funktion Datensätze mit Hilfe des Schlüsselwortes &amp;lt;code&amp;gt;SETOF&amp;lt;/code&amp;gt; zurückgeben, kann das mit &amp;lt;code&amp;gt;RETURN NEXT&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;RETURN QUERY&amp;lt;/code&amp;gt; realisiert werden. Mit Hilfe von &amp;lt;code&amp;gt;USING&amp;lt;/code&amp;gt; können Parameter in den SQL-Befehl eingefügt werden.&lt;br /&gt;
&lt;br /&gt;
In folgendem Beispiel wird  &amp;lt;code&amp;gt;RETURN NEXT&amp;lt;/code&amp;gt; verwendet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;postgresql&amp;quot;&amp;gt;&lt;br /&gt;
BEGIN; -- eine Transaktion starten&lt;br /&gt;
  CREATE TABLE foo (fooid INT, foosubid INT, fooname TEXT); -- Tabelle foo neu erstellen&lt;br /&gt;
  INSERT INTO foo VALUES (1, 2, &amp;#039;drei&amp;#039;);&lt;br /&gt;
  INSERT INTO foo VALUES (4, 5, &amp;#039;neun&amp;#039;);&lt;br /&gt;
  -- Funktion getAllFoo anlegen. Die Funktion soll alle Datensätze aus foo liefern,&lt;br /&gt;
  -- deren fooid größer als 0 ist:&lt;br /&gt;
  CREATE OR REPLACE FUNCTION getAllFoo() RETURNS SETOF foo AS&lt;br /&gt;
    $BODY$ -- Beginn der PL/pgSQL Prozedur&lt;br /&gt;
      DECLARE&lt;br /&gt;
        r foo%rowtype;&lt;br /&gt;
      BEGIN&lt;br /&gt;
        FOR r IN&lt;br /&gt;
          SELECT * FROM foo WHERE fooid &amp;gt; 0&lt;br /&gt;
        LOOP&lt;br /&gt;
          -- hier könnten weitere Anweisungen stehen&lt;br /&gt;
          RETURN NEXT r; -- Rückgabe des aktuellen Datensatzes aus SELECT&lt;br /&gt;
        END LOOP;&lt;br /&gt;
        RETURN;&lt;br /&gt;
      END&lt;br /&gt;
    $BODY$ -- Ende der PL/pgSQL Prozedur&lt;br /&gt;
  LANGUAGE plpgsql;&lt;br /&gt;
  SELECT * FROM getallfoo(); -- Dieses Select zeigt alle Datensätze die die Funktion liefert.&lt;br /&gt;
ROLLBACK; -- Das war ein Test, es soll nichts gespeichert werden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Verzweigung des Programmablaufs ===&lt;br /&gt;
Mit Hilfe von Bedingungen kann der Programmablauf gesteuert werden. Je nach Situation werden die Befehle im dafür vorgesehenen Abschnitt abgearbeitet.&lt;br /&gt;
&lt;br /&gt;
==== IF THEN ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;postgresql&amp;quot;&amp;gt;&lt;br /&gt;
IF boolean_expression THEN statements; END IF;&lt;br /&gt;
IF boolean_expression THEN statements; ELSE statements; END IF;&lt;br /&gt;
IF boolean_expression THEN statements; ELSIF boolean_expression THEN statements; END IF;&lt;br /&gt;
IF boolean_expression THEN statements; ELSIF boolean_expression THEN statements; ELSE statements; END IF;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;!-- Bug Syntaxhighlight ELSIF und ELSIF --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;IF&amp;lt;/code&amp;gt; prüft, ob eine Bedingung erfüllt ist. Trifft die Bedingung zu, wird der Code nach dem &amp;lt;code&amp;gt;THEN&amp;lt;/code&amp;gt; und  ausgeführt und ansonsten übersprungen. Mit &amp;lt;code&amp;gt;ELSIF&amp;lt;/code&amp;gt; können weitere Bedingungen hinzugefügt werden. Ist eine &amp;lt;code&amp;gt;ELSE&amp;lt;/code&amp;gt; vorhanden wird der darauf folgende Code ausgeführt, falls keine der Bedingungen zutrifft. Trifft mehr als eine der Bedingungen zu, wird nur die erste wahre Bedingung ausgeführt, und alle anderen wahren Bedingungen übersprungen. Die Schlüsselwörter &amp;lt;code&amp;gt;ELSEIF&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;ELSIF&amp;lt;/code&amp;gt; sind [[Synonym]]e.&lt;br /&gt;
&lt;br /&gt;
==== CASE WHEN ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;postgresql&amp;quot;&amp;gt;&lt;br /&gt;
CASE search_expression WHEN expressions THEN statements; END CASE;&lt;br /&gt;
CASE search_expression WHEN expressions THEN statements; ELSE statements; END CASE;&lt;br /&gt;
CASE WHEN boolean_expression THEN statements; END CASE;&lt;br /&gt;
CASE WHEN boolean_expression THEN statements; ELSE statements; END CASE;&lt;br /&gt;
-- Optional darf &amp;quot;WHEN … THEN …&amp;quot; beliebig oft vorkommen;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;CASE&amp;lt;/code&amp;gt;-Anweisung bietet zwei unterschiedliche Wege, im ersten Fall wird nach dem &amp;lt;code&amp;gt;CASE&amp;lt;/code&amp;gt; ein Suchausdruck angegeben. Dieser Ausdruck wird im Ausdruck der &amp;lt;code&amp;gt;WHEN&amp;lt;/code&amp;gt; folgt gesucht und anschließend wird der Code nach dem &amp;lt;code&amp;gt;THEN&amp;lt;/code&amp;gt; ausgeführt. Nach dem &amp;lt;code&amp;gt;WHEN&amp;lt;/code&amp;gt; können auch mehrere durch Kommas getrennte Ausdrücke ausgewertet werden.&lt;br /&gt;
Im zweiten Fall folgt dem &amp;lt;code&amp;gt;CASE&amp;lt;/code&amp;gt; das &amp;lt;code&amp;gt;WHEN&amp;lt;/code&amp;gt; direkt, und danach wird eine Bedingung angegeben. Trifft diese zu wird der Code nach dem  &amp;lt;code&amp;gt;THEN&amp;lt;/code&amp;gt; ausgeführt.&lt;br /&gt;
In beiden Fällen wird der dem &amp;lt;code&amp;gt;ELSE&amp;lt;/code&amp;gt; folgende Code ausgeführt, wenn nichts gefunden wurde. mit &amp;lt;code&amp;gt;END CASE&amp;lt;/code&amp;gt; wird die &amp;lt;code&amp;gt;CASE&amp;lt;/code&amp;gt;-Anweisung abgeschlossen. Wie zuvor bei &amp;lt;code&amp;gt;IF THEN&amp;lt;/code&amp;gt; wird nur der der ersten gültigen Bedingung folgende Codeabschnitt ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Beispiel für Verzweigung des Programmablaufes mit &amp;lt;code&amp;gt;IF THEN&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;CASE WHEN&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;postgresql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE FUNCTION foo(int) RETURNS void AS&lt;br /&gt;
$BODY$&lt;br /&gt;
  DECLARE&lt;br /&gt;
    i INTEGER := $1;&lt;br /&gt;
  BEGIN&lt;br /&gt;
    if i &amp;gt; 50 then&lt;br /&gt;
      RAISE NOTICE  &amp;#039;true %&amp;#039;, i;&lt;br /&gt;
    ELSIF i &amp;gt; 25 then&lt;br /&gt;
      RAISE NOTICE  &amp;#039;1. elsif %&amp;#039;, i;&lt;br /&gt;
    ELSIF i &amp;gt; 20 then&lt;br /&gt;
      RAISE NOTICE  &amp;#039;2. elsif %&amp;#039;, i;&lt;br /&gt;
    ELSE&lt;br /&gt;
      RAISE NOTICE  &amp;#039;if false else %&amp;#039;, i;&lt;br /&gt;
    END IF;&lt;br /&gt;
    CASE I&lt;br /&gt;
      WHEN 21,23,25,27 THEN&lt;br /&gt;
        RAISE NOTICE  &amp;#039;1. einfache when %&amp;#039;, i;&lt;br /&gt;
      WHEN 22,24,26,28 THEN&lt;br /&gt;
        RAISE NOTICE  &amp;#039;2. einfache when %&amp;#039;, i;&lt;br /&gt;
      ELSE&lt;br /&gt;
        RAISE NOTICE  &amp;#039;einfache case else %&amp;#039;, i;&lt;br /&gt;
      END CASE;&lt;br /&gt;
    CASE&lt;br /&gt;
      WHEN I BETWEEN 20 and 25 THEN&lt;br /&gt;
        RAISE NOTICE  &amp;#039;1. gesuchte when %&amp;#039;, i;&lt;br /&gt;
      WHEN I BETWEEN 26 and 30 THEN&lt;br /&gt;
        RAISE NOTICE  &amp;#039;2. gesuchte when %&amp;#039;, i;&lt;br /&gt;
      ELSE&lt;br /&gt;
        RAISE NOTICE  &amp;#039;gesuchte case else %&amp;#039;, i;&lt;br /&gt;
      END CASE;&lt;br /&gt;
  END;&lt;br /&gt;
$BODY$ LANGUAGE plpgsql;&lt;br /&gt;
Select foo(27);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Ausgabe mit pgAdmin:&lt;br /&gt;
HINWEIS:  1. elsif 27&lt;br /&gt;
HINWEIS:  1. einfache when 27&lt;br /&gt;
HINWEIS:  2. gesuchte when 27&lt;br /&gt;
Total query runtime: 35 ms.&lt;br /&gt;
1 row retrieved.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Schleifen ===&lt;br /&gt;
Mit den Schlüsselwörtern &amp;lt;code&amp;gt;LOOP, EXIT, CONTINUE, WHILE, FOR&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;FOREACH&amp;lt;/code&amp;gt; können Anweisungsblöcke wiederholt durchlaufen werden.&lt;br /&gt;
&lt;br /&gt;
==== Einfache LOOP Schleife ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;postgresql&amp;quot;&amp;gt;&lt;br /&gt;
LOOP&lt;br /&gt;
  statements;&lt;br /&gt;
  EXIT;&lt;br /&gt;
END LOOP;&lt;br /&gt;
 &amp;lt;&amp;lt;label&amp;gt;&amp;gt;&lt;br /&gt;
LOOP&lt;br /&gt;
    statements;&lt;br /&gt;
    EXIT  label  WHEN boolean_expression ;&lt;br /&gt;
END LOOP  label ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die einfache &amp;lt;code&amp;gt;LOOP&amp;lt;/code&amp;gt; Schleife endet sobald ein &amp;lt;code&amp;gt;EXIT&amp;lt;/code&amp;gt; die Schleife oder ein &amp;lt;code&amp;gt;RETURN&amp;lt;/code&amp;gt; die Funktion beendet. Folgt hinter dem &amp;lt;code&amp;gt;EXIT&amp;lt;/code&amp;gt; ein &amp;lt;code&amp;gt;WHEN&amp;lt;/code&amp;gt; mit einer Bedingung, wird die Schleife nur bei erfüllter Bedingung verlassen. PL/pgSQL erlaubt es Schleifen zu benennen. Der &amp;lt;code&amp;gt;LOOP&amp;lt;/code&amp;gt; Block wird auf jeden Fall bis zum &amp;lt;code&amp;gt;EXIT&amp;lt;/code&amp;gt; durchlaufen, egal ob die Bedingung auch schon zuvor zutraf. Mit der &amp;lt;code&amp;gt;CONTINUE WHEN&amp;lt;/code&amp;gt; Anweisung kann ein Teil der Schleife bedingt ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Der Name eines Blocks wird zwischen doppelten größerkleiner Zeichen &amp;lt;&amp;lt;&amp;gt;&amp;gt;festgelegt wie &amp;lt;nowiki&amp;gt;&amp;lt;&amp;lt;label&amp;gt;&amp;gt;&amp;lt;/nowiki&amp;gt; oberhalb. Die Benennung verbessert die Lesbarkeit des Codes.&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird der benannte Block &amp;quot;ablock&amp;quot; solange durchlaufen bis j=42 ist. Sobald das j größer als 21 wird, werden Notizen ausgegeben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;postgresql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION foo(int) RETURNS integer AS&lt;br /&gt;
$BODY$&lt;br /&gt;
  DECLARE&lt;br /&gt;
    i INTEGER:=$1;&lt;br /&gt;
    j INTEGER:=0;&lt;br /&gt;
  BEGIN&lt;br /&gt;
    &amp;lt;&amp;lt;ablock&amp;gt;&amp;gt; -- Eine Schleife wird mit ablock benannt.&lt;br /&gt;
    LOOP&lt;br /&gt;
      j:=j+7;&lt;br /&gt;
      EXIT ablock WHEN j&amp;gt;=i; -- Die Schleife endet wenn j&amp;gt;=i wird&lt;br /&gt;
      CONTINUE ablock WHEN j&amp;lt;(i/2) ; -- falls j größer dem halben i ist, wird der folgende Block durchlaufen:&lt;br /&gt;
        RAISE NOTICE &amp;#039; %&amp;#039;, j;&lt;br /&gt;
    END LOOP ablock;&lt;br /&gt;
    RETURN j;&lt;br /&gt;
  END;&lt;br /&gt;
$BODY$ LANGUAGE plpgsql;&lt;br /&gt;
Select foo(42);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Ausgabe mit pgAdmin:&lt;br /&gt;
HINWEIS:   21&lt;br /&gt;
HINWEIS:   28&lt;br /&gt;
HINWEIS:   35&lt;br /&gt;
Total query runtime: 27 ms.&lt;br /&gt;
1 row retrieved.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== WHILE LOOP Schleife ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;postgresql&amp;quot;&amp;gt;&lt;br /&gt;
WHILE boolean_expression LOOP&lt;br /&gt;
    statements;&lt;br /&gt;
END LOOP&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die einfache &amp;lt;code&amp;gt;WHILE LOOP&amp;lt;/code&amp;gt; Schleife wird nur durchlaufen wenn die Eingangsbedingung erfüllt ist, und endet sobald die Bedingung nicht mehr zutrifft. Auch diese Variante kann benannt werden.&lt;br /&gt;
&lt;br /&gt;
==== FOR Schleifen ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;postgresql&amp;quot;&amp;gt;&lt;br /&gt;
FOR varname IN  expression .. expression  LOOP -- FOR i IN REVERSE 10..2 BY 2 LOOP&lt;br /&gt;
    statements;&lt;br /&gt;
END LOOP;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;FOR&amp;lt;/code&amp;gt;-Schleife zählt eine Indexvariable vom Type &amp;lt;code&amp;gt;INTEGER&amp;lt;/code&amp;gt; die auch automatisch erstellt wird von einem festgelegten Startwert bis zu einem festgelegten Endwert. Start- und Zielwert sind durch zwei Punkte getrennt. Gibt man das Schlüsselwort REVERSE nach dem IN an, so wird vom größeren zum kleineren Wert heruntergezählt. Die Schrittweite ist aber in jedem Falle positiv anzugeben, auch beim Rückwärtszählen.&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;FOR&amp;lt;/code&amp;gt;-Schleife kann auch zum Durchlaufen einer Abfrage verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;postgresql&amp;quot;&amp;gt;&lt;br /&gt;
FOR wertliste IN query LOOP&lt;br /&gt;
    statements;&lt;br /&gt;
END LOOP&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die “wertliste” ist dabei eine Variable die die Felder der Abfrage “query” übernimmt. Die Variable wertliste übernimmt beim Durchlaufen der Abfrage jede Zeile der Abfrage einmal. Mit dieser Zeile wird dann der Schleifenkörper durchlaufen.&lt;br /&gt;
&lt;br /&gt;
Verwendet man statt einer erst “vor Ort” bei der FOR-Schleife definierten Abfrage (bzw. einem SQL-String via EXECUTE) einen expliziten Cursor, so wird in ausreichend neuen PostgreSQL-Versionen (9.x) die Schleifenvariable “wertliste” (analog zum Schleifenindex einer numerischen FOR-Schleife) implizit deklariert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;postgresql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE FUNCTION foo() RETURNS void AS&lt;br /&gt;
$body$&lt;br /&gt;
  DECLARE&lt;br /&gt;
    meinaktuellerview RECORD; -- die Variable meinaktuellerview wird als Type RECORD festgelegt.&lt;br /&gt;
  BEGIN&lt;br /&gt;
    RAISE NOTICE &amp;#039;Refreshing materialized views...&amp;#039;;&lt;br /&gt;
    FOR meinaktuellerview IN SELECT viewname, viewsql FROM fooviews ORDER BY foo.fooid LOOP&lt;br /&gt;
      -- jetzt beinhaltet &amp;quot;meinaktuellerview&amp;quot; einen Datensatz aus der Tabelle fooviews&lt;br /&gt;
      RAISE NOTICE &amp;#039;Ersetzen des materialisierten views %s ...&amp;#039;, quote_ident(meinaktuellerview.viewname);&lt;br /&gt;
      EXECUTE &amp;#039;TRUNCATE TABLE &amp;#039; || quote_ident(meinaktuellerview.viewname); -- Inhalt aus einer Tabelle löschen&lt;br /&gt;
      EXECUTE &amp;#039;INSERT INTO &amp;#039;&lt;br /&gt;
        || quote_ident(meinaktuellerview.viewname) || &amp;#039; &amp;#039; || meinaktuellerview.viewsql;&lt;br /&gt;
      -- eine in der Tabelle gespeicherte Abfrage wird an eine Tabelle angefügt.&lt;br /&gt;
    END LOOP;&lt;br /&gt;
    RAISE NOTICE &amp;#039;Erledigt: materialisierte Views sind aktuell.&amp;#039;;&lt;br /&gt;
    END;&lt;br /&gt;
$body$ LANGUAGE plpgsql;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;!-- es fehlt noch&lt;br /&gt;
Teile der For Schleifen und:&lt;br /&gt;
==== FOR EACH Schleife ====&lt;br /&gt;
&lt;br /&gt;
=== Fehlerbehandlung ===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://www.postgresql.org/docs/current/plpgsql.html PostgreSQL PL/pgSQL Documentation] (englisch, aktuelle PostgreSQL Version)&lt;br /&gt;
* Einführung in [https://www.postgresqltutorial.com/introduction-to-postgresql-stored-procedures/ PL/pgSQL] (englisch)&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{SORTIERUNG:Plpgsql}}&lt;br /&gt;
[[Kategorie:SQL]]&lt;br /&gt;
[[Kategorie:PostgreSQL]]&lt;br /&gt;
[[Kategorie:Abkürzung]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Thomas Dresler</name></author>
	</entry>
</feed>