| PostgreSQL: Das Offizielle Handbuch | ||||
|---|---|---|---|---|
| Zurück | Schnell zurück | Schnell nach vorne | Nach vorne | |
CREATE [ OR REPLACE ] FUNCTION name ( [ argtyp [, ...] ] )
RETURNS rückgabetyp
{ LANGUAGE sprachname
| IMMUTABLE | STABLE | VOLATILE
| CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT
| [EXTERNAL] SECURITY INVOKER | [EXTERNAL] SECURITY DEFINER
| AS 'definition'
| AS 'objektdatei', 'linksymbol'
} ...
[ WITH ( attribut [, ...] ) ]CREATE FUNCTION definiert eine neue Funktion. CREATE OR REPLACE FUNCTION erzeugt entweder eine neue Funktion oder ersetzt eine bestehende Funktion.
Wenn ein Schemaname angegeben wurde (zum Beispiel CREATE FUNCTION mein_schema.meine_funktion ...), dann wird die Funktion im angegebenen Schema erzeugt, ansonsten wird sie im aktuellen Schema erzeugt. Der Name der Funktion darf nicht mit dem Namen einer anderen Funktion mit den selben Argumentdatentypen im selben Schema übereinstimmen. Funktionen mit unterschiedlichen Argumenttypen können jedoch den gleichen Namen haben (das nennt sich überladen).
Um die Definition einer bestehenden Funktion zu ändern, verwenden Sie CREATE OR REPLACE FUNCTION. Sie können damit aber nicht den Namen oder die Argumenttypen einer Funktion ändern (wenn Sie es versuchen, dann würden Sie einfach eine neue, getrennte Funktion erzeugen). Außerdem können Sie mit CREATE OR REPLACE FUNCTION nicht den Rückgabetyp einer Funktion ändern. Dazu müssen Sie die Funktion löschen und neu erzeugen.
Wenn Sie eine Funktion löschen und neu erzeugen, dann ist die neue Funktion nicht das selbe Objekt wie die alte; bestehende Regeln, Sichten, Trigger usw., die die alte Funktion verwenden, sind dann nicht mehr funktionsfähig. Mit CREATE OR REPLACE FUNCTION können Sie eine Funktion ändern ohne Objekte, die die Funktion verwenden, zu beeinträchtigen.
Der Benutzer, der die Funktion erzeugt, wird ihr Eigentümer.
Der Name der zu erzeugenden Funktion.
Die Datentypen der Funktionsargumente, falls es welche gibt. Die Argumenttypen können Basistypen, zusammengesetzte Typen oder Domänen sein oder den Typ einer bestehenden Tabellenspalte kopieren.
Den Typ einer bestehenden Spalte kopiert man, indem man tabellenname.spaltennname%TYPE schreibt; das ist manchmal nützlich um die Funktion unabhängig von der Definition einer Tabelle machen zu können.
Je nach Implementierungssprache kann man auch „Pseudotypen“ wie cstring verwenden. Ein Pseudotyp bedeutet, dass der eigentliche Argumenttyp entweder unvollständig angegeben ist oder außerhalb der normalen SQL-Datentypen steht.
Der Datentyp des Rückgabewertes. Der Rückgabetyp kann ein Basistyp, ein zusammengesetzter Typ oder eine Domäne sein oder den Typ einer bestehenden Tabellenspalte kopieren. Wie man den Typ einer Tabellenspalte kopiert steht oben unter argtyp.
Je nach Implementierungssprache kann man auch „Pseudotypen“ wie cstring verwenden. Wenn man SETOF vor den Typ schreibt, dann gibt das an, dass die Funktion eine Ergebnismenge anstatt eines einzelnen Wertes zurückgibt.
Der Name der Sprache, in der die Funktion implementiert ist. Zur Auswahl stehen SQL, C, internal und die Namen von benutzerdefinierten prozeduralen Sprachen (siehe auch createlang). Aus Kompatibilität mit früheren Versionen kann der Sprachname auch in Apostrophen stehen.
Diese Attribute informieren das System, ob es sicher ist, bei der Laufzeitoptimierung mehrere Aufrufe einer Funktion durch einen einzigen zu ersetzen. Höchstens eines dieser Attribute sollte angegeben werden. Wenn keines angegeben ist, dann ist die Standardeinstellung VOLATILE.
IMMUTABLE (unveränderlich) gibt an, dass die Funktion immer das gleiche Ergebnis zurückgibt, wenn sie mit den gleichen Argumentwerten aufgerufen wird; das heißt, sie liest keine Informationen aus der Datenbank oder verwendet sonstige Informationen, die nicht direkt in der Argumentliste vorkommen. Wenn diese Option angegeben wird, dann kann jeder Aufruf der Funktion mit nur konstanten Argumenten sofort durch das Ergebnis der Funktion ersetzt werden.
STABLE (stabil) gibt an, dass die Funktion innerhalb einer Tabellendurchsuchung das gleiche Ergebnis bei gleichen Argumentwerten zurückgibt, aber dass das Ergebnis sich zum nächsten SQL-Befehl ändern kann. Das ist die passende Wahl für Funktionen, die Informationen aus der Datenbank lesen, Parametervariablen verwenden (z.B. die aktuelle Zeitzone) usw. Die Funktionen der Familie current_timestamp sind auch stabil, weil ihr Wert sich in einer Transaktion nicht ändert.
VOLATILE (flüchtig) gibt an, dass sich der Wert der Funktion jederzeit ändern kann, auch innerhalb einer Tabellendurchsuchung, und dass deswegen keine Optimierungen vorgenommen werden können. Relativ wenige Datenbankfunktion haben diese Eigenschaft; einige Beispiele sind random(), currval(), timeofday(). Beachten Sie, dass alle Funktionen mit Nebeneffekten als VOLATILE eingeordnet werden müssen, selbst wenn die Ergebnisse vorhersagbar sind, damit die Funktionsaufrufe nicht wegoptimiert werden können; ein Beispiel dafür ist setval().
CALLED ON NULL INPUT (die Standardeinstellung) gibt an, dass die Funktion normal aufgerufen wird, wenn eines ihrer Argumente der NULL-Wert ist. Es liegt dann in der Verantwortung des Autors der Funktion, NULL-Werte zu erkennen und wie gewünscht zu verarbeiten.
RETURNS NULL ON NULL INPUT oder STRICT gibt an, dass die Funktion immer den NULL-Wert zurückgibt, wenn eines der Argumente der NULL-Wert ist. Wenn dieser Parameter angegeben wird, dann wird die Funktion gar nicht ausgeführt, wenn eines der Argumente der NULL-Wert ist; stattdessen wird der NULL-Wert automatisch als Ergebnis genommen.
SECURITY INVOKER gibt an, dass die Funktion mit den Privilegien des Benutzers, der sie aufruft, ausgeführt werden soll. (Das ist die Voreinstellung.) SECURITY DEFINER gibt an, dass die Funktion mit den Privilegien des Benutzers, der sie erzeugt hat, aufgerufen werden soll.
Das Schlüsselwort EXTERNAL ist wegen der Konformität mit dem SQL-Standard vorhanden, kann aber weggelassen werden, weil diese Einstellung, im Gegensatz zum SQL-Standard, nicht nur für externe Funktionen gilt.
Eine Zeichenkette, die die Funktion definiert; die Bedeutung hängt von der Sprache ab. Es könnte der Name einer internen Funktion sein, der Pfad zu einer Objektdatei, ein SQL-Befehl oder Text in einer prozeduralen Sprache.
Diese Form der AS-Klausel wird für dynamisch ladbare C-Funktionen verwendet, wenn der Funktionsname im C-Code nicht der selbe wie der Name der SQL-Funktion ist. Die Zeichenkette objektdatei ist der Name einer Datei, die das dynamisch zu ladende Objekt enthält, und linksymbol ist das Link-Symbol der Funktion, das heißt der Name der Funktion im C-Code. Wenn das Link-Symbol weggelassen wird, dann wird davon ausgegangen, dass die Funktion genauso heißt wie die SQL-Funktion, die gerade erzeugt wird.
Die ältere Methode um zusätzliche Informationen über die Funktion anzugeben. Die folgenden Attribute können auftreten:
Gleichbedeutend mit STRICT und RETURNS NULL ON NULL INPUT
isCachable ist ein obsoletes Äquivalent von IMMUTABLE; der Kompatibilität halber wird es immer noch akzeptiert.
Bei den Attributnamen wird Groß- und Kleinschreibung nicht unterschieden.
Weitere Informationen, wie man Funktionen schreibt, erhalten Sie in Abschnitt 33.3.
Die volle Typsyntax von SQL kann für die Argumenttypen und den Rückgabetyp verwendet werden, aber einige Einzelheiten der Typangabe (z.B. das Präzisionsfeld beim Typ numeric) werden von CREATE FUNCTION nicht beachtet und müssen von der Implementierung der Funktion verarbeitet werden.
In PostgreSQL können Funktion überladen werden; das heißt, der selbe Name kann für mehrere Funktionen verwendet werden, wenn sie verschiedene Argumenttypen haben. Die C-Namen aller Funktionen müssen jedoch unterschiedlich sein, also müssen Sie überladenen C-Funktionen unterschiedliche C-Namen geben (zum Beispiel, indem Sie die Argumenttypen in den Namen einbauen).
Wenn wiederholte Aufrufe von CREATE FUNCTION auf die selbe Objektdatei verweisen, dann wird die Datei nur einmal geladen. Um die Datei aus dem Speicher zu entfernen und neu zu laden (vielleicht bei der Entwicklungsarbeit), verwenden Sie den Befehl LOAD.
Um eine Funktion definieren zu können, benötigen Sie das Privileg USAGE für die Sprache.
Hier ist ein einfaches Beispiel, das Ihnen beim Einstieg helfen kann. Weitere Informationen und Beispiele finden Sie in Abschnitt 33.3.
CREATE FUNCTION add(integer, integer) RETURNS integer
AS 'select $1 + $2;'
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT;
Ein Befehl CREATE FUNCTION ist im SQL-Standard definiert. Die PostgreSQL-Version ist ähnlich, aber nicht voll kompatibel. Die Attribute sind nicht portierbar und auch nicht die verschiedenen Sprachen.
| Zurück | Zum Anfang | Nach vorne |
| CREATE DOMAIN | Nach oben | CREATE GROUP |