Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
CREATE FUNCTION
Erzeugt eine neue benutzerdefinierte Skalarfunktion (UDF), die entweder eine SQL SELECT Klausel oder ein Python-Programm verwendet.
Weitere Informationen und Beispiele finden Sie unter Benutzerdefinierte Funktionen in Amazon Redshift.
Erforderliche Berechtigungen
Sie benötigen eine der folgenden Berechtigungen, um OR ausführen CREATE zu können: REPLACE FUNCTION
Für CREATEFUNCTION:
Superuser kann sowohl vertrauenswürdige als auch nicht vertrauenswürdige Sprachen verwenden, um Funktionen zu erstellen.
Benutzer mit dem CREATE [ORREPLACE] FUNCTION -Privileg können Funktionen mit vertrauenswürdigen Sprachen erstellen.
Für REPLACEFUNCTION:
Superuser
Benutzer mit dem CREATE [ORREPLACE] FUNCTION -Privileg
Funktionsbesitzer
Syntax
CREATE [ OR REPLACE ] FUNCTION f_function_name ( { [py_arg_name py_arg_data_type | sql_arg_data_type } [ , ... ] ] ) RETURNS data_type { VOLATILE | STABLE | IMMUTABLE } AS $$ { python_program | SELECT_clause } $$ LANGUAGE { plpythonu | sql }
Parameter
- ODER REPLACE
-
Gibt an, dass die vorhandene Funktion ersetzt wird, wenn eine Funktion mit demselben Namen und denselben Eingabeargument-Datentypen bzw. derselben Signatur vorhanden ist. Sie können eine Funktion nur durch eine neue Funktion ersetzen, wenn diese einen identischen Satz von Datentypen definiert. Sie müssen Superuser sein, um eine Funktion zu ersetzen.
Wenn Sie eine Funktion definieren, die den gleichen Namen wie eine vorhandene Funktion, aber eine andere Signatur besitzt, erstellen Sie eine neue Funktion. Der Funktionsname wird also überladen. Weitere Informationen finden Sie unter Überladen von Funktionsnamen.
- f_function_name
-
Der Name der Funktion. Wenn Sie einen Schemanamen angeben (wie
myschema.myfunction
), wird die Funktion mithilfe des angegebenen Schemas erstellt. Andernfalls wird die Funktion im aktuellen Schema erstellt. Weitere Informationen zu gültigen Namen finden Sie unter Namen und Kennungen.Wir empfehlen, dass Sie allen UDF Namen das Präfix voranstellen
f_
. Amazon Redshift reserviert dasf_
Präfix für UDF Namen. Durch die Verwendung desf_
Präfixes stellen Sie also sicher, dass Ihr UDF Name nicht mit bestehenden oder future integrierten SQL Funktionsnamen von Amazon Redshift in Konflikt steht. Weitere Informationen finden Sie unter Vermeidung von UDF Namenskonflikten.Sie können mehr als eine Funktion mit demselben Funktionsnamen definieren, wenn sich die Datentypen für die Eingabeargumente unterscheiden. Der Funktionsname wird also überladen. Weitere Informationen finden Sie unter Überladen von Funktionsnamen.
- py_arg_name py_arg_data_type | sql_arg_data_type
-
Für ein Python UDF eine Liste von Eingabeargumentnamen und Datentypen. Für a SQL UDF eine Liste von Datentypen ohne Argumentnamen. Verweisen Sie in einem Python UDF mit den Argumentnamen auf Argumente. Verweisen Sie in a SQL UDF auf Argumente mit $1, $2 usw., basierend auf der Reihenfolge der Argumente in der Argumentliste.
Für a SQL UDF können die Eingabe- und Rückgabedatentypen jeder standardmäßige Amazon Redshift Redshift-Datentyp sein. Für ein Python UDF können die Eingabe- und Rückgabedatentypen SMALLINTINTEGER,BIGINT,DECIMAL,REAL, DOUBLEPRECISION,BOOLEAN,CHAR, VARCHARDATE, oder seinTIMESTAMP. Darüber hinaus unterstützen benutzerdefinierte Python-Funktionen (UDFs) den DatentypANYELEMENT. Dieser wird basierend auf dem Datentyp des entsprechenden Arguments, das zur Laufzeit bereitgestellt wird, automatisch in einen Standarddatentyp umgewandelt. Wenn mehrere Argumente verwendet werdenANYELEMENT, werden sie zur Laufzeit alle auf der Grundlage des ersten ANYELEMENT Arguments in der Liste in denselben Datentyp aufgelöst. Weitere Informationen erhalten Sie unter UDFPython-Datentypen und Datentypen.
Sie können maximal 32 Argumente angeben.
- RETURNSdata_type
-
Der Datentyp des Werts, der von der Funktion zurückgegeben wird. Der RETURNS Datentyp kann ein beliebiger Amazon Redshift Redshift-Standarddatentyp sein. Darüber hinaus UDFs kann Python einen Datentyp von verwendenANYELEMENT, der auf der Grundlage des zur Laufzeit bereitgestellten Arguments automatisch in einen Standarddatentyp konvertiert wird. Wenn Sie ANYELEMENT für den Rückgabedatentyp angeben, muss mindestens ein Argument verwendet werdenANYELEMENT. Der tatsächliche Rückgabedatentyp entspricht dem Datentyp, der für das ANYELEMENT Argument angegeben wurde, wenn die Funktion aufgerufen wird. Weitere Informationen finden Sie unter UDFPython-Datentypen.
- VOLATILE | STABLE | IMMUTABLE
-
Informiert den Abfragenoptimierer über die Volatilität der Funktion.
Sie erhalten die beste Optimierung, wenn Sie Ihre Funktion mit der strengsten Volatilitätskategorie bezeichnen, die für sie zulässig ist. Wenn die Kategorie jedoch zu eng gefasst ist, besteht das Risiko, dass der Optimierer fälschlicherweise einige Aufrufe überspringt. Dies führt zu einem falschen Ergebnissatz. Beginnend mit der Volatilitätskategorie mit der geringsten Strenge sind dies die Volatilitätskategorien:
-
VOLATILE
-
STABLE
-
IMMUTABLE
VOLATILE
Bei gleichen Argumenten kann die Funktion unterschiedliche Ergebnisse für aufeinanderfolgende Aufrufe zurückgeben, auch für die Zeilen in einer einzelnen Anweisung. Der Abfragenoptimierer kann keine Annahmen über das Verhalten einer volatilen Funktion machen. Daher muss eine Abfrage, die eine volatile Funktion verwendet, die Funktion für jede Eingabezeile erneut evaluieren.
STABLE
Bei gleichen Argumenten gibt die Funktion garantiert die gleichen Ergebnisse für alle Zeilen zurück, die innerhalb einer einzelnen Anweisung verarbeitet werden. Die Funktion kann unterschiedliche Ergebnisse zurückgeben, wenn sie in unterschiedlichen Anweisungen aufgerufen wird. Diese Kategorie ermöglicht dem Optimierer, mehrere Aufrufe der Funktion innerhalb einer einzelnen Anweisung zu einem einzigen Aufruf für die Anweisung zu optimieren.
IMMUTABLE
Bei gleichen Argumenten gibt die Funktion stets das gleiche Ergebnis zurück. Wenn eine Abfrage eine
IMMUTABLE
-Funktion mit konstanten Argumenten aufruft, evaluiert der Optimierer die Funktion im Voraus. -
- AS $$-Anweisung $$
-
Ein Konstrukt, das die Ausführung der Anweisung einschließt. Die Literalschlüsselwörter
AS $$
und$$
sind erforderlich.Amazon Redshift erfordert, dass Sie die Anweisung in Ihrer Funktion unter Verwendung eines Formats umschließen, das Dollaranführung genannt wird. Alles innerhalb der Umschließung wird exakt wie angegeben übergeben. Sie müssen für Sonderzeichen keine Escape-Zeichen verwenden, da der Inhalt der Zeichenfolge wie exakt wie angegeben geschrieben wird.
Bei der Dollaranführung verwenden Sie ein Dollarzeichenpaar ($$), um den Anfang und das Ende der auszuführenden Anweisung zu kennzeichnen, wie im folgenden Beispiel gezeigt.
$$
my statement
$$Optional können Sie zwischen den beiden Dollarzeichen eine Zeichenfolge angeben, um die Identifizierung der Anweisung zu unterstützen. Die von Ihnen im umschließenden Dollarzeichenpaar am Anfang und am Ende verwendete Zeichenfolge muss identisch sein. Diese Zeichenfolge unterscheidet zwischen Groß- und Kleinschreibung und unterliegt den gleichen Einschränkungen wie Bezeichner, die nicht in einer Anführung stehen, darf jedoch keine Dollarzeichen enthalten. Im folgenden Beispiel wird die Zeichenfolge verwendet
test
.$test$
my statement
$test$Weitere Informationen zur Angabe von Dollar-Anführungszeichen finden Sie in der Postgre-Dokumentation unter „Zeichenkettenkonstanten in Dollar-Anführungszeichen“ unter Lexikalische Struktur
. SQL - python_program
-
Ein gültiges ausführbares Python-Programm, das einen Wert zurückgibt. Die Anweisung, die Sie mit der Funktion übergeben, muss den Einrückungsanforderungen entsprechen, die in den Vorgaben für Python-Code
auf der Python-Website angegeben sind. Weitere Informationen finden Sie unter Python-Sprachunterstützung für UDFs. - SQL_Klausel
-
Eine SQL SELECT Klausel.
Die SELECT Klausel darf keine der folgenden Klauseltypen enthalten:
-
FROM
-
INTO
-
WHERE
-
GROUPVON
-
ORDERVON
-
LIMIT
-
- LANGUAGE{plpythonu | sql}
-
Legen Sie für Python fest
plpythonu
. FürSQL, spezifizieren Sie.sql
Sie benötigen die Erlaubnis zur Verwendung von language for SQL oder plpythonu. Weitere Informationen finden Sie unter UDFSicherheit und Berechtigungen.
Nutzungshinweise
Verschachtelte Funktionen
Sie können eine andere SQL benutzerdefinierte Funktion (UDF) von a aus aufrufen. SQL UDF Die verschachtelte Funktion muss vorhanden sein, wenn Sie den CREATE FUNCTION Befehl ausführen. Amazon Redshift verfolgt keine Abhängigkeiten fürUDFs. Wenn Sie also die verschachtelte Funktion löschen, gibt Amazon Redshift keinen Fehler zurück. Dies schlägt jedoch UDF fehl, wenn die verschachtelte Funktion nicht existiert. Die folgende Funktion ruft beispielsweise die f_sql_greater
Funktion in der SELECT Klausel auf.
create function f_sql_commission (float, float ) returns float stable as $$ select f_sql_greater ($1, $2) $$ language sql;
UDFSicherheit und Privilegien
Um eine zu erstellenUDF, benötigen Sie die Erlaubnis zur Verwendung von language for SQL oder plpythonu (Python). Standardmäßig LANGUAGE SQL ist USAGE ON für erteilt. PUBLIC Sie müssen jedoch bestimmten Benutzern oder Gruppen ausdrücklich USAGE ON LANGUAGE PLPYTHONU gewähren.
Um die Nutzung für zu widerrufenSQL, widerrufen Sie zunächst die Nutzung vonPUBLIC. Gewähren Sie dann SQL nur bestimmten Benutzern oder Gruppen die Nutzung, die zur Erstellung berechtigt sind SQLUDFs. Das folgende Beispiel widerruft die Nutzung SQL von und gewährt PUBLIC dann der Benutzergruppe udf_devs
die Nutzung.
revoke usage on language sql from PUBLIC; grant usage on language sql to group udf_devs;
Um eine ausführen zu könnenUDF, benötigen Sie für jede Funktion die Ausführungsberechtigung. Standardmäßig wird die Ausführungsberechtigung für neue UDFs Benutzer erteiltPUBLIC. Um die Nutzung einzuschränken, entziehen Sie der Funktion PUBLIC die Ausführungsberechtigung. Gewähren Sie die Berechtigung anschließend den spezifischen Einzelpersonen oder Gruppen.
Im folgenden Beispiel wird die Ausführungsberechtigung für die Funktion f_py_greater
entzogen und PUBLIC dann der Benutzergruppe udf_devs
die Nutzung gewährt.
revoke execute on function f_py_greater(a float, b float) from PUBLIC; grant execute on function f_py_greater(a float, b float) to group udf_devs;
Superuser haben standardmäßig alle Berechtigungen.
Weitere Informationen erhalten Sie unter GRANT und REVOKE.
Beispiele
Skalares Python-Beispiel UDF
Das folgende Beispiel erstellt eine UDF Python-Datei, die zwei ganze Zahlen vergleicht und den größeren Wert zurückgibt.
create function f_py_greater (a float, b float) returns float stable as $$ if a > b: return a return b $$ language plpythonu;
Im folgenden Beispiel wird die SALES Tabelle abgefragt und die neue f_py_greater
Funktion aufgerufen, um entweder COMMISSION oder 20 Prozent von zurückzugeben, je nachdemPRICEPAID, welcher Wert größer ist.
select f_py_greater (commission, pricepaid*0.20) from sales;
Skalares Beispiel SQL UDF
Im folgenden Beispiel wird eine Funktion erstellt, die zwei Zahlen vergleicht und die größere zurückgibt.
create function f_sql_greater (float, float) returns float stable as $$ select case when $1 > $2 then $1 else $2 end $$ language sql;
Die folgende Abfrage ruft die neue f_sql_greater
Funktion zur Abfrage der SALES Tabelle auf und gibt COMMISSION entweder 20 Prozent von zurück, je nachdemPRICEPAID, welcher Wert größer ist.
select f_sql_greater (commission, pricepaid*0.20) from sales;