it-swarm.com.de

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

In einem Kommentar von diese Frage wird erwähnt, dass es in PostgreSQL einen kleinen Unterschied zwischen "Gespeicherten Prozeduren" und "Gespeicherten Funktionen" gibt.

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

Die Syntax selbst scheint etwas 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 jedoch als PROCEDURE.

Was ist der Unterschied zwischen diesen beiden?

37
DrColossos

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, beispielsweise im Systemkatalog pg_proc. Das ist ein Überbleibsel von PostQUEL. Alle Funktionen, die einige Personen (möglicherweise mit Erfahrung in verschiedenen Datenbanksystemen) möglicherweise mit Prozeduren verknüpfen, z. B. ihre Relevanz für die Verhinderung von SQL-Injektionen oder die Verwendung von Ausgabeparametern, gelten auch für Funktionen, wie sie in PostgreSQL vorhanden sind.

Wenn Leute in der PostgreSQL-Community 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, was aktuelle Funktionen nicht können tun. Die Verwendung des Begriffs "gespeicherte Prozedur" in diesem Zusammenhang scheint analog zu anderen Datenbankprodukten zu sein. Siehe diese Mailingliste Thread für eine vage Idee.

In der Praxis wird diese Unterscheidung zwischen 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 Funktion ohne Rückgabewert annehmen. (Der SQL-Standard scheint einen Mittelweg einzuschlagen, da eine Prozedur standardmäßig ein anderes Transaktionsverhalten als eine Funktion aufweist, dies kann jedoch pro angepasst werden Objekt.) In jedem Fall und insbesondere bei Fragen zu Stack Exchange mit einer sehr gemischten Zielgruppe sollten Sie vermeiden, zu viel anzunehmen und klarere Begriffe zu verwenden oder die erwarteten Eigenschaften zu definieren.

44

In Bezug auf DDL hat Postgres keine Prozedurobjekte, sondern nur Funktionen. Postgres-Funktionen können Werte zurückgeben oder ungültig machen, sodass sie die Rollen von Funktionen und Prozeduren in anderen RDBMS übernehmen. Das Wort 'Prozedur' im create trigger bezieht 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-Prozeduren haben bestimmte Regeln: Sie müssen als Funktion ohne Argumente und mit einem Rückgabetyp von Trigger deklariert sein . Beispiel hier .

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 unterscheidet zwischen Unterroutinen und Funktionen).

Solange eine Funktion in PostgreSQL etwas zurückgibt, das einer Tabelle ähnelt, können Sie die Ausgabe dieser Funktion so verwenden, als wäre es eine Standardtabelle. Das CREATE TRIGGER Die Syntax 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 nur spekulieren, warum die Nomenklatur seltsam ist.

TL; DR-Version: Mit PostgreSQL entspricht "procedure" "function".

8

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

 - kann viele Eingabe- und Ausgabeparameter haben 
 - kann zum Ändern von Datenbanktabellen/-strukturen/-daten verwendet werden 
 - wird normalerweise nicht in Anweisungen zum Einfügen/Aktualisieren/Löschen/Auswählen verwendet 
 - kann mehrere Eingabeparameter haben, aber nur einen einzigen Wert zurückgeben (dh Zeichenfolgenverkettung) 
 - kann einen Satz als Eingabe akzeptieren, einen einzelnen Wert zurückgeben (dh dbo.FindLargestPig (ListOfPigs)) 
 - eine Tabelle zurückgeben (dh select * from dbo.ExplodeString ("dies ist eine Liste von Wörtern")) 
 - kann in Anweisungen zum Auswählen/Einfügen/Aktualisieren/Löschen verwendet werden 
 - KANN NICHT zum Ändern von Datenbanktabellen/-strukturen/-daten verwendet werden 
6
datagod

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

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

Wenn ich die akzeptierte Antwort auf abstrakter konzeptioneller Ebene vergleiche, verstehe ich den Unterschied zwischen Funktionalität und Eingabe-/Ausgabeperspektive. Unten habe ich sp und f verwendet, um die gespeicherte Prozedur bzw. Funktion darzustellen.

  1. Verwendung in einem Ausdruck: sp kann nicht in einem Ausdruck verwendet werden, solange die Funktion dies kann. Dies bedeutet, dass Sie Ihren zurückgegebenen Wert aus einem f in anderen Anweisungen wie verwenden können

    select * 
    from table 
    where col_a < (select col_A from f())
    
  2. wert zurückgeben: sp gibt einen Wert nicht automatisch zurück, es sei denn, Sie geben den Refcursor an, geben den Typ zurück, öffnen einen Cursor und geben ihn zurück. f gibt das Ergebnis in der letzten Anweisung zurück, in die eine 'return'-Klausel eingebettet ist, wie eine select - Klausel.

  3. einzel-/Mehrfachergebnismengen zurückgeben: Hier beziehen sich Ergebnismengen auf eine Liste von Ergebnissen, die sich im Format unterscheiden können, z. B. eine Menge aus einer Ganzzahl, einem Textarray und zwei Tabellen. sp kann mehrere Sätze zurückgeben, solange Sie den Refcursor-Rückgabetyp angeben, einen Cursor öffnen und zurückgeben. F kann jedoch nur einen Satztyp zurückgeben.

Normalerweise werden gespeicherte Prozeduren verwendet, um die Datenbankdaten oder -struktur zu ändern, wenn kein Rückgabewert benötigt wird, wie Löschen, Aktualisieren, Löschen usw.; oder Situationen, in denen mehrere Ergebnismengen erforderlich sind. Die Funktion wird dagegen hauptsächlich für einfache Abfragen ausgewählt.

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

2
Frank

Beachten Sie, dass in PostgreSQL 11 gespeicherte Prozeduren als neues Schemaobjekt hinzugefügt wurden. Sie können eine neue Prozedur erstellen, indem Sie CREATE PROCEDURE Anweisung.

Gespeicherte Prozeduren unterscheiden sich in folgenden Punkten von Funktionen:

  • Gespeicherte Prozeduren haben keinen Rückgabewert
  • Sie können Transaktionen in gespeicherten Prozeduren festschreiben und zurücksetzen, jedoch nicht in Funktionen
  • Sie führen eine gespeicherte Prozedur mit der Anweisung CALL anstelle einer Anweisung SELECT aus.
1
d4nyll