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)';
Copy

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, schreiben Sie den Handler in einer anderen Sprache als SQL.

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)
  $$
  ;
Copy