Mithilfe des CREATE FUNCTION-Befehls können Sie eine benutzerdefinierte Funktion erstellen. Mit CREATE OR REPLACE FUNCTION können Sie eine Funktion erstellen oder eine vorhandene gleichnamige Funktion mit neuen Objektdateien, einem neuen Rückgabewert, neuem Funktionsverhalten oder einer neuen Protokollierungsstufe aktualisieren.
CREATE [OR REPLACE] FUNCTION function_name(argument_types)
RETURNS return_type LANGUAGE CPP PARAMETER STYLE NPSGENERIC
[FENCED | NOT FENCED] [DETERMINISTIC | NOT DETERMINISTIC]
[RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT]
[MAXIMUM MEMORY mem] [LOGMASK <MASK>]
[NO DEPENDENCIES| DEPENDENCIES deplibs]
[API VERSION [ 1 | 2 ] ]
[ENVIRONMENT 'name' = 'value', 'name2' = 'value2']
[TABLE, TABLE FINAL ALLOWED | TABLE ALLOWED | TABLE FINAL ALLOWED]
[PARALLEL ALLOWED | PARALLEL NOT ALLOWED]
[EXTERNAL CLASS NAME 'class_name']
[EXTERNAL HOST OBJECT 'host_object_filename']
[EXTERNAL SPU OBJECT 'SPU_object_filename']
| Eingabe | Beschreibung |
|---|---|
| function_name | Gibt den Namen der Funktion an, die Sie erstellen wollen.
Dies ist die SQL-Kennung, die verwendet wird, um die Funktion in einem SQL-Ausdruck aufzurufen. Der Name muss die Benennungskriterien für Schlüsselwörter und Kennungen erfüllen, die im IBM Netezza Handbuch für Datenbankbenutzer beschrieben sind. Wenn die Funktion vorhanden ist, können Sie den Namen mit dem CREATE OR REPLACE-Befehl nicht ändern. Sie können für Systeme, die mehrere Schemas unterstützen, einen Namen im Format 'Schema.Funktion' angeben, um eine Funktion in einem anderen Schema der aktuellen Datenbank zu erstellen. Sie können eine Funktion nicht in einer anderen Datenbank erstellen. |
| argument_types | Gibt eine Liste vollständig angegebener Funktionsargumentdatentypen an. Alle IBM® Netezza-Datentypen werden unterstützt. Zeichenfolgen müssen eine Größe oder ANY für generische Größen einschließen. Bei numerischen Typen (NUMERIC) müssen die Genauigkeit und die Anzahl der Kommastellen oder ANY für generische Größen angegeben werden. Sie können auch den VARARGS-Wert angeben, um ein Aggregat mit variablen Argumenten zu erstellen, bei dem Benutzer bis zu 64 Werte eines beliebigen unterstützten Datentyps eingeben können. VARARGS kann nicht mit anderen Werten kombiniert werden. Sie können keine weiteren Argumente in der Liste angeben. Sie können die Argumentliste oder die Größen nicht ändern. Sie können VARARGS aus der Argumentliste entfernen oder einer ansonsten leeren Argumentliste hinzufügen. Sie können die Argumentliste mit diesem Befehl nicht ändern. Wenn die Funktion vorhanden ist, können Sie die Argumenttypliste mit dem CREATE OR REPLACE-Befehl nicht ändern. Mit CREATE OR REPLACE können Sie auch einige Aspekte der UDF-Argumenttypen ändern. Sie können beispielsweise die Größe einer Zeichenfolge oder die Genauigkeit und die Anzahl der Kommastellen eines numerischen Werts ändern. |
| RETURNS return_type | Der Wert von 'return_type' ist ein vollständig angegebenes Argument und ein vollständig angegebener Typ. Er folgt denselben Regeln wie 'argument_types'. Wenn die API-Version 2 ist, kann 'return_type' auch TABLE(name type, name2 type2, ...) oder TABLE(ANY) sein, um eine Tabellenfunktion anzugeben. |
| LANGUAGE | Gibt die Programmiersprache an, die für die Funktion verwendet wird. Zurzeit wird nur der Standardwert CPP (C++) unterstützt. |
| PARAMETER STYLE | Der Standardwert und einzige unterstützte Wert ist zurzeit NPSGENERIC. |
| FENCED NOT FENCED |
Gibt an, ob die Funktion in einem separaten Prozess im geschützten Adressraum ausgeführt wird (abgeschirmter Modus). Zum Erstellen einer nicht abgeschirmten Funktion müssen Sie über die Administratorberechtigung für die Abschirmungsaufhebung verfügen. |
| [DETERMINISTIC | NOT DETERMINISTIC] | DETERMINISTIC gibt an, dass die benutzerdefinierte Funktion eine reine Funktion ist, also eine Funktion, die bei Angabe derselben Argumentwerte immer denselben Wert zurückgibt und keine Nebeneffekte hat. Das System betrachtet möglicherweise mehrere Instanzen einer deterministischen UDF, die identische Argumentlisten haben, als Kandidaten für CSE (Common Subexpression Elimination). Der Standardwert ist DETERMINISTIC. Ist eine Funktion als DETERMINISTIC definiert, wird sie nicht einmal pro Zeile, sondern einmal bei der Anweisungsvorbereitung aufgerufen, wenn einer der folgenden Punkte zutrifft:
Ein Argument ist eine Konstante, wenn es ein SQL-Literal oder das Ergebnis einer benutzerdefinierten oder integrierten Funktion ist, die nicht einmal pro Zeile, sondern einmal bei der Anweisungsvorbereitung ausgewertet wird. |
| [RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT] | RETURNS NULL ON NULL INPUT gibt an, dass die Funktion immer NULL zurückgibt, wenn eines ihrer Argument NULL ist. Wenn Sie diesen Parameter angeben, wird die Funktion nicht ausgeführt, wenn es NULL-Argumente gibt; stattdessen wird automatisch ein NULL-Ergebnis angenommen. CALLED ON NULL INPUT (der Standardwert) gibt an, dass die Funktion normal aufgerufen wird, wenn eines ihrer Argumente NULL ist. Es ist dann die Verantwortung des Funktionserstellers, bei Bedarf auf NULL-Werte zu prüfen und entsprechend zu reagieren. Weitere Informationen zu Abfrageoptimierungseffekten für diese Einstellung finden Sie in Netezza-Abfrageoptimierung und UDX-Aufrufe. |
| MAXIMUM MEMORY | Gibt die mögliche Speicherbelegung durch die Funktion an. Der Größenwert kann ein leerer Wert oder ein aus einer Zahl und dem Buchstaben b (Byte), k (Kilobyte), m (Megabyte) oder g (Gigabyte) bestehender Wert sein. Beispiele für gültige Werte sind '0', '1k', '100k', '1g' oder '10m'. Der Standardwert ist 0. |
| LOGMASK mask | Gibt die Protokollsteuerebene für die Funktion an. Gültige Werte sind NONE, DEBUG und TRACE oder eine durch Kommas getrennte Kombination aus DEBUG und TRACE. |
| DEPENDENCIES deplibs | Gibt eine optionale Liste von Abhängigkeiten von benutzerdefinierten gemeinsam genutzten Bibliotheken für die UDX an. Sie können einen Bibliotheksnamen oder eine durch Kommas getrennte Liste mit Bibliotheksnamen angeben. |
| API VERSION [1 | 2] | Gibt die Version der UDX-Schnittstelle an, die vom Aggregat verwendet wird. Die Angabe für API VERSION muss der kompilierten Version der Objektdateien für den Host und die SPU entsprechen. Der Standardwert ist 1. Wenn Sie kompilierte Objekte der Version 2 einschließen, müssen Sie API VERSION 2 angeben. |
| ENVIRONMENT | Gibt ein Name/Wert-Paar an, das bei der Ausführung der Funktion verfügbar ist. Sie können mehrere durch Kommas getrennte Name/Wert-Paare angeben. Zum Ändern eines vorhandenen Sets mit mindestens einem Umgebungspaar müssen Sie alle Umgebungseinstellungen angeben. Der Änderungsbefehl ersetzt die aktuelle Liste durch die im ALTER-Befehl angegebene Liste. |
| TABLE, TABLE FINAL ALLOWED TABLE ALLOWED TABLE FINAL ALLOWED |
Gibt die Optionen an, die steuern, wie die benutzerdefinierte Tabelle aufgerufen werden kann.
'FINAL' bedeutet, dass die Tabellenfunktion nach der Verarbeitung aller Eingabezeilen aufgerufen wird, sodass sie mehr Zeilen ausgeben kann. |
| PARALLEL ALLOWED | Gibt an, dass eine benutzerdefinierte Tabellenfunktion abhängig von der Entscheidung des Optimierungsprogramms auf dem Host oder der SPU aufgerufen werden kann. |
| PARALLEL NOT ALLOWED | Gibt an, dass die Tabellenfunktion abhängig von der Entscheidung des Optimierungsprogramms immer auf dem Host oder einer ausgewählten SPU aufgerufen wird. |
| EXTERNAL CLASS NAME 'class_name' | Gibt den Namen der C++-Klasse an, die die Funktion implementiert. Die Klasse muss sich aus der Udf-Basisklasse ableiten und eine statische Methode implementieren, die eine Instanz der Klasse instanziiert. |
| EXTERNAL HOST OBJECT 'host_object_filename' | Gibt den Namen des Pfads zum kompilierten Objekt für die Hostausführung an. |
| EXTERNAL SPU OBJECT 'SPU_object_filename' | Gibt den Pfadnamen für die kompilierte Objektdatei der Linux-SPU an. Geben Sie das kompilierte Objekt spu10 für Rev10-SPUs in Modellen von IBM Netezza 1000 und Netezza 1000 an. |
| Ausgabe | Beschreibung |
|---|---|
| CREATE FUNCTION | Die Nachricht, die das System zurückgibt, wenn der Befehl erfolgreich war. |
| ERROR: User 'username' is not allowed to create/drop functions. | Das System gibt diese Nachricht zurück, wenn Ihr Benutzerkonto nicht über die Berechtigung zum Erstellen von Funktionen verfügt. |
| ERROR: Synonym 'name' already exists | Das System gibt diese Nachricht zurück, wenn ein Synonym mit dem Namen vorhanden ist, den Sie für die Funktion angegeben haben. |
| ERROR: function name already exists with the same signature | Dieser Fehler wird zurückgegeben, wenn Sie einen CREATE FUNCTION-Befehl absetzen und wenn eine gleichnamige Funktion mit derselben Argumenttypliste in der Datenbank vorhanden ist. Verwenden Sie anstelle dessen CREATE OR REPLACE FUNCTION. |
| ERROR: function name already exists with the same signature | Das System gibt diese Nachricht zurück, wenn eine Funktion mit dem Namen vorhanden ist, den Sie für die Funktion angegeben haben. |
| NOTICE: FunctionCreate: existing UDX name(argument_types) differs in size of string/numeric arguments | Diese Nachricht gibt an, dass eine UDX mit diesem Namen vorhanden ist, bei der jedoch für Zeichenfolgeargumente oder numerische Argumente andere Größen angegeben wurden. Wenn Sie die Funktionssignatur nicht ändern wollten, prüfen Sie die Signatur und stellen Sie sicher, dass sie richtig ist. |
| ERROR: lookupLibrary: library libname does not exist | Die Nachricht, die vom System zurückgegeben wird, wenn es die als Abhängigkeit angegebene benutzerdefinierte gemeinsam genutzte Bibliothek nicht finden kann. |
| ERROR: ProcedureCreate: Can't use version 2 features without specifying API VERSION 2 for udx_name | Die Nachricht gibt an, dass Sie Optionen der Version 2 für den SQL-Befehl angegeben haben, im SQL-Befehl haben Sie jedoch keine API-Version 2 angegeben. |
| ERROR: Version mismatch for function udx_name. Specified version 2, but provided version 1 object file | Für die kompilierten Objektdateien wird die API-Version 1 verwendet, der SQL-Befehl verwendet jedoch die Funktionalität von Version 2. Sie müssen kompilierte Objekte der Version 2 erstellen oder Optionen, die Features der Version 2 angeben, aus dem Befehl entfernen. |
| ERROR: Version mismatch for function udx_name. Specified version 1, but provided version 2 object file | Für die kompilierten Objektdateien wird die API-Version 2 verwendet, der SQL-Befehl verwendet jedoch die Funktionalität von Version 1. Sie müssen entweder kompilierte Objekte der Version 1 angeben oder den ALTER-Befehl so ändern, dass er die Syntax von Version 2 verwendet. |
| ERROR: Environment names can't be empty | Der Namenswert einer Umgebungseinstellung darf keine leere Zeichenfolge sein. |
| ERROR: type 'type' is not yet defined | Der angegebene Rückgabetyp ist kein bekannter Netezza-Datentyp. |
Wenn Sie eine Funktion erstellen, muss die Funktionssignatur (d. h. Name und Argumenttypliste) in ihrer Datenbank eindeutig sein. Keine andere benutzerdefinierte Funktion oder kein anderes benutzerdefiniertes Aggregat kann denselben Namen und dieselbe Argumenttypliste in derselben Datenbank enthalten.
Mit dem CREATE OR REPLACE-Befehl können Sie den Funktionsnamen oder die Argumenttypliste nicht ändern. Sie können einige Aspekte der Argumenttypen ändern. Sie können beispielsweise die Größe einer Zeichenfolge oder die Genauigkeit und die Anzahl der Kommastellen eines numerischen Werts ändern. Zum Ändern eines Funktionsnamens und/oder einer Argumenttypliste müssen Sie die Funktion löschen und anschließend mit dem neuen Namen und/oder der neuen Argumenttypliste erstellen.
Sie können keine benutzerdefinierte Funktion ersetzen, die in einer aktiven Abfrage verwendet wird. Nach dem Abschluss der aktiven Abfragetransaktion verarbeitet das Netezza-System den CREATE OR REPLACE FUNCTION-Befehl, um die Funktion zu aktualisieren.
Bei Systemen, die mehrere Schemas unterstützen, müssen Sie Datenbankadministrator oder Eigner der aktuellen Datenbank bzw. des aktuellen Schemas sein. Andere Benutzer müssen über die Berechtigung zum Erstellen von Funktionen verfügen, um den CREATE FUNCTION-Befehl verwenden zu können. Wenn Sie mit CREATE OR REPLACE FUNCTION eine UDF ändern, müssen Sie über die Berechtigung zum Erstellen von Funktionen und die Änderungsberechtigung für die UDF verfügen, um sie ändern zu können. Zum Erstellen einer nicht abgeschirmten Funktion müssen Sie über die Administratorberechtigung für die Abschirmungsaufhebung verfügen.
Mithilfe des CREATE FUNCTION-Befehls können Sie eine neue benutzerdefinierte Funktion erstellen und ihr Eigner werden. Sie müssen die C++-Dateien der Funktion erstellen und mithilfe von nzudxcompile kompilieren, bevor Sie diesen Befehl verwenden können, um die Funktion für das Netezza-System zu registrieren. Die Funktion wird als ein Objekt in der aktuellen Datenbank definiert.
MYDB.SCHEMA(MYUSER)=> CREATE FUNCTION CustomerName(varchar(64000))
RETURNS int4 LANGUAGE CPP PARAMETER STYLE npsgeneric
EXTERNAL CLASS NAME 'CCustomerName'
EXTERNAL HOST OBJECT '/home/nz/udx_files/customername.o_x86'
EXTERNAL SPU OBJECT '/home/nz/udx_files/customername.o_spu10'