SQL-UDF-Einschränkungen¶
Unter diesem Thema werden die Einschränkungen beschrieben, die für in SQL geschriebene Handler gelten.
Einschränkungen bei Argument- und Rückgabetypen werden manchmal ignoriert¶
Bestimmte Typmerkmale, die für ein Argument oder einen Rückgabewert deklariert wurden, werden beim Aufruf der UDF ignoriert. In diesen Fällen kann der zurückgegebene Wert so verwendet werden, wie er erhalten wurde, unabhängig davon, ob er den in der Deklaration angegebenen Einschränkungen entspricht oder nicht.
Die folgenden Angaben werden bei UDFs ignoriert, deren Logik in SQL geschrieben ist:
Genauigkeit und Anzahl der Dezimalstellen für Argumente und Rückgabewerte vom Typ NUMBER
Länge für Argumente und Rückgabewerte vom Typ VARCHAR
Beispiel¶
Der Code im folgenden Beispiel deklariert, dass das Argument arg1
und der Rückgabewert VARCHAR nicht länger als ein Zeichen sein dürfen. Wenn Sie diese Funktion jedoch mit einem Argument arg1
aufrufen, dessen Wert länger als ein Zeichen ist, wird die Funktion so ausgeführt, als ob die Einschränkung nicht angegeben wäre.
CREATE OR REPLACE FUNCTION tf (arg1 VARCHAR(1))
RETURNS VARCHAR(1)
LANGUAGE SQL AS 'SHA2(a)';
Dynamisches SQL wird nicht unterstützt, wenn auf Datenbankobjekte verwiesen wird¶
Der Verweis auf Datenbankobjekte mit dynamischer SQL führt zu einer Fehlermeldung, die einen Text wie den folgenden enthält:
Compilation of SQL UDF failed: SQL compilation error: syntax error... unexpected '<variable_name>'
Wenn Sie dynamische SQL-Anweisungen konstruieren müssen, die verschiedene Datenbankobjekte verwenden, sollten Sie stattdessen eine gespeicherte Prozedur schreiben. Sie können eine gespeicherte Prozedur in einer der folgenden Sprachen schreiben:
Beispiel¶
Der Code im folgenden Beispiel schlägt fehl, weil die Funktion IDENTIFIER verwendet wird, um auf eine Tabelle zu verweisen, deren Name dynamisch mit der Variablen table_name_parameter
angegeben wird.
CREATE OR REPLACE FUNCTION profit2(table_name_parameter VARCHAR)
RETURNS NUMERIC(11, 2)
AS
$$
SELECT SUM((retail_price - wholesale_price) * number_sold)
FROM IDENTIFIER(table_name_parameter)
$$
;