Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (Deutsch) » SQL Anywhere Server - SQL-Referenzhandbuch » Verwendung von SQL » SQL-Anweisungen » SQL-Anweisungen (A-D)

 

CREATE FUNCTION-Anweisung

Mit dieser Anweisung erstellen Sie eine neue benutzerdefinierte SQL-Funktion in einer Datenbank. Hinweise zur Erstellung von Schnittstellen zu externen Funktionen finden Sie unter CREATE FUNCTION-Anweisung (externe Prozeduren). Hinweise zur Erstellung von Webdienstfunktionen finden Sie unter CREATE FUNCTION-Anweisung (Webdienste).

CREATE [ OR REPLACE | TEMPORARY ] FUNCTION [ Eigentümer.]Funktionsname 
( [ Parameter, ... ] )
RETURNS Datentyp 
[ SQL SECURITY { INVOKER | DEFINER } ]
[ ON EXCEPTION RESUME ]
[ [ NOT ] DETERMINISTIC ]
Zusammengesetzte_Anweisung | AS tsql_zusammengesetzte_Anweisung
Parameter :
   [ IN ] Parametername Datentyp [ DEFAULT Ausdruck ]
tsql_zusammengesetzte_Anweisung:
SQL-Anweisung
SQL-Anweisung
 ...
Parameter
  • OR REPLACE-Klausel   Wenn Sie CREATE OR REPLACE FUNCTION angeben, wird eine neue Funktion erstellt oder eine bestehende Funktion mit demselben Namen ersetzt. Wenn eine Funktion ersetzt wird, ändert diese Klausel die Definition der Funktion, lässt aber bestehende Berechtigungen unberührt.

    Sie können die OR REPLACE-Klausel nicht mit temporären Funktionen verwenden.

  • TEMPORARY-Schlüsselwort   Die Angabe von CREATE TEMPORARY FUNCTION bedeutet, dass die Funktion lediglich für die Verbindung sichtbar ist, die sie erstellt hat, und dass sie automatisch gelöscht wird, wenn die Verbindung beendet wird. Temporäre Funktionen können auch explizit gelöscht werden. Sie können kein ALTER, GRANT oder REVOKE für sie ausführen, und im Gegensatz zu anderen Funktionen werden temporäre Funktionen nicht im Katalog oder Transaktionslog aufgezeichnet.

    Temporäre Funktionen werden mit den Berechtigungen ihres Erstellers (aktueller Benutzer) oder eines angegebenen Eigentümers ausgeführt. Sie können unter folgenden Voraussetzungen einen Eigentümer für eine temporäre Funktion festlegen:

    • Wenn die temporäre Funktion in einer permanenten gespeicherten Prozedur erstellt wird.

    • Wenn der Eigentümer der temporären Funktion mit dem der permanenten gespeicherten Prozedur identisch ist.

    Um den Eigentümer einer temporären Funktion zu löschen, müssen Sie erst die temporäre Funktion löschen.

    Temporäre Funktionen können erstellt und gelöscht werden, wenn eine Verbindung mit einer schreibgeschützten Datenbank besteht.

    Sie können die OR REPLACE-Klausel nicht mit temporären Funktionen verwenden.

  • SQL SECURITY-Klausel   Die SQL SECURITY-Klausel legt fest, ob die Funktion als INVOKER (der Benutzer, der die Funktion aufruft) oder als DEFINER (der Benutzer, dem die Funktion gehört) aufgerufen wird. Standardwert ist DEFINER.

  • zusammengesetzte_Anweisung   Eine Gruppe von SQL-Anweisungen in BEGIN und END, getrennt durch Semikola. Weitere Hinweise finden Sie unter BEGIN-Anweisung.

  • TSQL_zusammengesetzte_Anweisung   Ein Batch von Transact-SQL-Anweisungen. Weitere Hinweise finden Sie unter Überblick über Transact-SQL-Batches und CREATE PROCEDURE-Anweisung [T-SQL].

  • ON EXCEPTION RESUME-Klausel   Fehlerbehandlung wie in Transact-SQL verwenden. Weitere Hinweise finden Sie unter CREATE PROCEDURE-Anweisung.

  • [ NOT ] DETERMINISTIC-Klausel   Verwenden Sie diese Klausel, um anzugeben, ob Funktionen deterministisch oder nicht deterministisch sind. Wenn diese Klausel weggelassen wird, gilt das deterministische Verhalten der Funktion als nicht angegeben (Standard).

    Wenn eine Funktion als DETERMINISTIC deklariert wird, muss Sie jedes Mal, wenn sie mit denselben Parametern aufgerufen wird, denselben Wert zurückgeben.

    Wenn eine Funktion als NOT DETERMINISTIC deklariert wird, garantiert sie nicht, dass bei identischen Parametern ein identischer Wert zurückgegeben wird. Eine Funktion, die als NOT DETERMINISTIC deklariert ist, wird bei jedem Aufruf in einer Abfrage neu berechnet. Diese Klausel muss verwendet werden, wenn bekannt ist, dass das Ergebnis der Funktion mit gegebenen Parametern unterschiedlich ausfallen kann.

    Außerdem sollten Funktionen mit Nebenwirkungen wie der Änderung von Basisdaten als NOT DETERMINISTIC deklariert werden. Beispiel: Eine Funktion, die Primärschlüsselwerte generiert und in einer INSERT … SELECT-Anweisung verwendet wird, muss als NOT DETERMINISTIC deklariert werden:

    CREATE FUNCTION keygen( increment INTEGER )
    RETURNS INTEGER
    NOT DETERMINISTIC
    BEGIN
      DECLARE keyval INTEGER;
      UPDATE counter SET x = x + increment;
      SELECT counter.x INTO keyval FROM counter;
      RETURN keyval
    END
    INSERT INTO new_table
    SELECT keygen(1), ...
    FROM old_table;

    Funktionen können als DETERMINISTIC deklariert werden, wenn sie stets denselben Wert für gegebene Eingabeparameter zurückgeben.

Bemerkungen

Die CREATE FUNCTION-Anweisung erstellt eine Funktion in der Datenbank. Eine Funktion kann für einen anderen Benutzer erstellt werden, indem der Name eines Eigentümers angegeben wird. Eine Funktion kann, entsprechend den Berechtigungen, auf die gleiche Weise wie andere Nicht-Aggregatfunktionen verwendet werden.

Parameternamen müssen den Regeln für Datenbankbezeichner folgen. Sie müssen einen gültigen SQL-Datentyp umfassen und das Schlüsselwort IN kann vorangestellt werden. Dieses Präfix weist darauf hin, dass das Argument ein Ausdruck ist, welcher der Funktion einen Wert zur Verfügung stellt.

Wenn Funktionen ausgeführt werden, müssen nicht alle Parameter angegeben werden. Wenn in der CREATE FUNCTION-Anweisung ein Standardwert bereitgestellt wird, werden den fehlenden Parametern die Standardwerte zugeordnet. Falls kein Argument vom Aufrufer angegeben und kein Standardwert gesetzt ist, wird ein Fehler ausgegeben.

Wenn SQL SECURITY INVOKER angegeben ist, wird mehr Speicher verwendet, weil für jeden Benutzer, der die Prozedur aufruft, ein Vermerk erfolgen muss. Außerdem erfolgt bei SQL SECURITY INVOKER auch eine Namensauflösung als Aufrufer. Sie sollten daher mit Umsicht vorgehen und alle Objektnamen (Tabellen, Prozeduren, etc.) mit ihrem richtigen Eigentümer qualifizieren.

Alle Funktionen werden als deterministisch behandelt, sofern sie nicht als NOT DETERMINISTIC deklariert sind. Deterministische Funktionen geben für die gleichen Parameter ein konsistentes Ergebnis zurück und weisen keine Nebenwirkungen auf. Das heißt, der Datenbankserver nimmt an, dass zwei aufeinander folgende Aufrufe derselben Funktion mit denselben Parametern das gleiche Ergebnis zurückgeben und keine unerwünschten Nebeneffekte auf die Semantik der Abfrage haben.

Wenn eine Funktion eine Ergebnismenge zurückgibt, kann sie nicht zusätzlich Ausgabeparameter setzen oder einen Rückgabewert zurückgeben.

Berechtigungen

Sie müssen über RESOURCE-Datenbankberechtigungen verfügen, es sei denn, Sie erstellen eine temporäre Funktion.

Externe Funktionen einschließlich Java-Funktionen erfordern DBA-Berechtigungen.

Nebenwirkungen

Automatisches Festschreiben (Autocommit).

Siehe auch
Standards und Kompatibilität
  • SQL/2003   Persistent Stored Module-Funktion.

Beispiele

Die folgende Funktion verkettet die Zeichenfolge 'Vorname' mit der Zeichenfolge 'Nachname'.

CREATE FUNCTION fullname(
   firstname CHAR(30),
   lastname CHAR(30) )
RETURNS CHAR(61)
BEGIN
   DECLARE name CHAR(61);
   SET name = firstname || ' ' || lastname;
   RETURN (name);
END;

Im folgenden Beispiel wird die Funktion fullname ersetzt, die im ersten Beispiel erstellt wurde. Nachdem die Funktion ersetzt wurde, wird die lokale Variable name entfernt:

CREATE OR REPLACE FUNCTION fullname(
   firstname CHAR(30),
   lastname CHAR(30) )
RETURNS CHAR(61)
BEGIN
   RETURN = firstname || ' ' || lastname;
END;

Die folgenden Beispiele veranschaulichen die Verwendung der fullname-Funktion.

Rückgabe eines vollständigen Namens aus zwei angegebenen Zeichenfolgen:

SELECT fullname ( 'joe', 'smith' );
fullname('joe', 'smith')
joe smith

Namensliste aller Mitarbeiter:

SELECT fullname ( GivenName, Surname )
FROM Employees;
fullname (GivenName, Surname)
Fran Whitney
Matthew Cobb
Philip Chin
Julie Jordan
...

Die folgende Funktion benutzt Transact-SQL-Syntax:

CREATE FUNCTION DoubleIt( @Input INT )
RETURNS INT
AS
BEGIN
  DECLARE @Result INT
  SELECT @Result = @Input * 2
  RETURN @Result
END;

Die Anweisung SELECT DoubleIt( 5 ) gibt den Wert 10 zurück.