Streng genommen hatte Postgres keinen gespeicherte Prozeduren wie im ISO/IEC-Standard vor Version 11 definiert. Der Begriff wird oft fälschlicherweise für Funktionen verwendet , die im Wesentlichen die gleiche Funktionalität (und mehr) bieten wie andere RDBMS mit "gespeicherten Prozeduren". Der Hauptunterschied liegt in der Abwicklung von Transaktionen.
- Was sind die Unterschiede zwischen „gespeicherten Prozeduren“ und „gespeicherten Funktionen“?
Wahre gespeicherte Prozeduren werden endlich mit Postgres 11 eingeführt:
- Wann werden gespeicherte Prozeduren/benutzerdefinierte Funktionen verwendet?
Funktionen sind atomar in Postgres und werden automatisch innerhalb ihrer eigenen Transaktion ausgeführt, sofern sie nicht innerhalb einer äußeren Transaktion aufgerufen werden. Sie werden immer innerhalb einer einzigen Transaktion ausgeführt und sind erfolgreich oder schlagen vollständig fehl . Folglich kann man innerhalb der Funktion keine Transaktionen beginnen oder festschreiben. Und Befehle wie VACUUM
, CREATE DATABASE
, oder CREATE INDEX CONCURRENTLY
die nicht in einem Transaktionskontext laufen, sind nicht erlaubt.
Das Handbuch zu PL/pgSQL:
Funktionen und Auslöseprozeduren werden immer innerhalb einer Transaktion ausgeführt, die durch eine äußere Abfrage eingerichtet wurde – sie können diese Transaktion nicht starten oder festschreiben, da es keinen Kontext für ihre Ausführung gäbe. Allerdings enthält ein Block eine EXCEPTION
-Klausel bildet effektiv eine Teiltransaktion, die rückgängig gemacht werden kann, ohne die äußere Transaktion zu beeinträchtigen.
Fehlerbehandlung:
Standardmäßig bricht jeder Fehler, der in einer PL/pgSQL-Funktion auftritt, die Ausführung der Funktion und tatsächlich auch der umgebenden Transaktion ab. Sie können Fehler abfangen und beheben, indem Sie BEGIN
verwenden mit einer EXCEPTION
blockieren Klausel.
Es gibt Ausnahmen , einschließlich, aber nicht beschränkt auf:
- in Protokolldateien geschriebene Daten
-
Änderungen an einer Sequenz
Wichtig :Einige PostgreSQL-Datentypen und -Funktionen haben spezielle Regeln bezüglich des Transaktionsverhaltens. Insbesondere Änderungen an einer Sequenz (und damit dem Zähler einer mit
serial
deklarierten Spalte ) sind sofort für alle anderen Transaktionen sichtbar und werden nicht zurückgesetzt, wenn die Transaktion, die die Änderungen vorgenommen hat, abgebrochen wird. -
vorbereitete Erklärungen
- SQL Fiddle-Demo
-
dblink-Aufrufe (oder ähnlich)
- Unterstützt Postgres verschachtelte oder autonome Transaktionen?