Was sind die Unterschiede zwischen "Gespeicherten Prozeduren" und "Gespeicherten Funktionen"?

36

In einem Kommentar zu dieser Frage wird erwähnt, dass es in PostgreSQL einen kleinen Unterschied zwischen "Stored Procedrues" und "Stored Funtions" gibt.

Der Kommentar verweist auf einen Wikipedia-Artikel, aber einige davon scheinen nicht zuzutreffen (z. B. dass sie in einer SELECTAnweisung verwendet werden können).

Die Syntax selbst scheint ein bisschen verwirrend zu sein:

CREATE FUNCTION emp_stamp() RETURNS trigger AS $emp_stamp$
    BEGIN
       [...]
    END;
$emp_stamp$ LANGUAGE plpgsql;

CREATE TRIGGER emp_stamp BEFORE INSERT OR UPDATE ON emp
    FOR EACH ROW EXECUTE PROCEDURE emp_stamp();

Sie erstellen ein FUNCTION, bezeichnen es aber als PROCEDURE.

Was ist der Unterschied zwischen diesen beiden?

DrColossos
quelle

Antworten:

43

Offiziell hat PostgreSQL nur "Funktionen". Triggerfunktionen werden manchmal als "Triggerprozeduren" bezeichnet, aber diese Verwendung hat keine eindeutige Bedeutung. Intern werden Funktionen manchmal als Prozeduren bezeichnet, z. B. im Systemkatalog pg_proc. Das ist ein Überbleibsel von PostQUEL. Alle Funktionen, die einige Personen (möglicherweise mit Erfahrung in verschiedenen Datenbanksystemen) mit Prozeduren in Verbindung bringen, z. B. ihre Relevanz für das Verhindern von SQL-Injektionen oder die Verwendung von Ausgabeparametern, gelten auch für Funktionen, wie sie in PostgreSQL vorhanden sind.

Wenn die Leute in der PostgreSQL-Community jedoch von "gespeicherten Prozeduren" oder "echten gespeicherten Prozeduren" sprechen, meinen sie oft ein hypothetisches Merkmal eines funktionsähnlichen Objekts, das Transaktionen in seinem Körper starten und stoppen kann, etwas, das aktuelle Funktionen nicht können machen. Die Verwendung des Begriffs "gespeicherte Prozedur" in diesem Zusammenhang scheint analog zu anderen Datenbankprodukten zu sein. In diesem Mailinglisten- Thread finden Sie eine vage Vorstellung.

In der Praxis wird diese Unterscheidung von Funktion und Prozedur hinsichtlich ihrer Transaktionssteuerungsfähigkeiten jedoch nicht allgemein akzeptiert, und sicherlich werden viele Programmierer ohne Datenbankverzerrung eine Pascal-ähnliche Interpretation einer Prozedur als eine Funktion ohne Rückgabewert annehmen. (Der SQL-Standard scheint einen Mittelweg einzuschlagen, da eine Prozedur standardmäßig ein anderes Transaktionsverhalten aufweist als eine Funktion, dies kann jedoch objektspezifisch angepasst werden.) Also auf jeden Fall und insbesondere bei Fragen zu Stack Exchange mit Bei einem sehr gemischten Publikum sollten Sie vermeiden, zu viel anzunehmen, klarere Begriffe verwenden oder die Eigenschaften definieren, die Sie erwarten.

Peter Eisentraut
quelle
14

In Bezug auf DDL verfügt Postgres nicht über Prozedurobjekte, sondern nur über Funktionen. Postgres-Funktionen können Werte zurückgeben oder ungültig sein, sodass sie die Rolle von Funktionen und Prozeduren in anderen RDBMS übernehmen. Das Wort 'Prozedur' in create triggerbezieht sich auf eine Funktion.

In der Postgres-Dokumentation ist 'procedure' auch ein Synonym für das Datenbankobjekt, das als Funktion bezeichnet wird, z. B .: " Mit dem Befehl CREATE FUNCTION wird eine Triggerprozedur erstellt ".

Trigger 'Procedures' haben bestimmte Regeln: Sie müssen als Funktion ohne Argumente und als Rückgabetyp eines Triggers deklariert werden . Beispiel hier .

Jack Douglas
quelle
8

Die Begriffe "gespeicherte Prozedur" und "gespeicherte Funktion" werden in PostgreSQL synonym verwendet und bedeuten im Allgemeinen dasselbe. Andere Datenbanken können zwischen einer Prozedur und einer Funktion unterscheiden (ähnlich wie VB zwischen Unterprogrammen und Funktionen unterscheidet).

Solange eine Funktion in PostgreSQL etwas zurückgibt, das einer Tabelle ähnelt, können Sie die Ausgabe dieser Funktion wie eine Standardtabelle verwenden. Die CREATE TRIGGERSyntax ist etwas verwirrend, aber ich vermute, dass sie vor der Fertigstellung des ANSI-Standards vorhanden war. Ich habe nur eine Kopie von SQL: 2003, daher kann ich nicht viel mehr tun, als zu spekulieren, warum die Nomenklatur seltsam ist.

TL; DR-Version: Mit PostgreSQL ist "procedure" gleichbedeutend mit "function".

Jeremiah Peschka
quelle
6

In MSSQL ist eine gespeicherte Prozedur ein vorkompilierter Satz von SQL-Befehlen.
Eine gespeicherte Prozedur:

 - Kann viele Eingabe- und Ausgabeparameter haben
 - kann verwendet werden, um Datenbanktabellen / -strukturen / -daten zu ändern
 - werden normalerweise nicht in insert / update / delete / select-Anweisungen verwendet
Benutzerdefinierte Funktionen gibt es in verschiedenen Varianten. Abhängig von der Art der geschriebenen Funktion werden folgende Funktionen ausgeführt:
  - kann mehrere Eingabeparameter haben, aber nur einen einzigen Wert zurückgeben (zB String-Verkettung)
  - kann ein Set als Eingabe akzeptieren, einen einzelnen Wert zurückgeben (zB dbo.FindLargestPig (ListOfPigs))
  - gebe eine Tabelle zurück (dh wähle * aus dbo.ExplodeString ("das ist eine Liste von Wörtern"))
  - Kann in Select / Insert / Update / Delete-Anweisungen verwendet werden
  - KANN NICHT zum Ändern von Datenbanktabellen / -strukturen / -daten verwendet werden

datagod
quelle
5

Die kurze Antwort lautet, dass eine Funktion einen Wert zurückgibt, eine Prozedur jedoch nicht.

Diese Unterscheidung war in Persistent Stored Modules (SQL / PSM) vorhanden, die für SQL 1992 vorgeschlagen wurden. Ich weiß nicht, ob SQL / PSM es jemals in die Standards geschafft hat.

Mike Sherrill 'Cat Recall'
quelle
von 2003 glaube ich
Xenoterracide
Das klingt bemerkenswert nach der Syntax für VB. Eine Funktion gibt einen Wert zurück und eine Prozedur nicht (wenn Sie also einen Rückgabewert in einer Funktion hätten, würde dieser auf dem Compiler
explodieren
@jcolebrand Tatsächlich sind die Namen in Pascal offensichtlicher. Eine Prozedur gibt kein Ergebnis zurück, während eine Funktion dies tut. Aus historischen Gründen verwendet VBA die Sprache FORTRAN, die Anrufe (genannt?) Sie SUBROUTINE & FUNKTION . Moderne C-Sprachen haben nur Funktionen, aber typisierte Sprachen haben die Option, Funktionen zu löschen, die Prozeduren mit einem anderen Namen sind. Ein beliebter Trend besteht darin, für alles nur normale Funktionen zu verwenden und etwas zurückzugeben, das ignoriert werden kann, wenn Sie möchten.
Manngo
2

Wenn ich die akzeptierte Antwort von der abstrakten konzeptuellen Ebene vergleiche, verstehe ich den Unterschied zwischen Funktionalität und Ein- / Ausgabeperspektive. Unten habe ich sp und f verwendet, um gespeicherte Prozeduren bzw. Funktionen darzustellen.

  1. Verwendung in einem Ausdruck: sp kann nicht in einem Ausdruck verwendet werden, während function kann. Dies bedeutet, dass Sie Ihren zurückgegebenen Wert aus af in anderen Anweisungen wie verwenden können

    select * 
    from table 
    where col_a < (select col_A from f())
  2. Wert zurückgeben: sp gibt nur dann automatisch einen Wert zurück, wenn Sie den Rückgabetyp refcursor angeben , einen Cursor öffnen und zurückgeben. f gibt das Ergebnis in der letzten Anweisung zurück, in die eine 'return'-Klausel wie eine select- Klausel eingebettet ist.

  3. Zurückgeben einzelner / mehrerer Ergebnismengen: Hier beziehen sich Ergebnismengen auf eine Liste von Ergebnissen, die sich im Format unterscheiden können, z. B. eine Menge von einzelnen Ganzzahlen, Textfeldern und zwei Tabellen. sp kann mehrere Mengen zurückgeben, solange Sie den Rückgabetyp refcursor angeben, einen Cursor öffnen und zurückgeben. F kann jedoch nur einen Satztyp zurückgeben.

In der Regel werden gespeicherte Prozeduren verwendet, um die Datenbankdaten oder -strukturen zu ändern, bei denen kein Rückgabewert erforderlich ist, z. B. Löschen, Aktualisieren, Löschen usw .; oder Situationen, in denen mehrere Ergebnismengen erforderlich sind. Die Funktion wird dagegen meist für einfache Abfragen gewählt.

Weitere Informationen zu meiner Erklärung finden Sie unter folgendem Link: Gespeicherte Prozeduren und Funktionen in PostgreSQL

Frank
quelle