CREATE-FUNCTION

Eine in der Oracle-DB gespeicherte Funktion wird mittels einer CREATE FUNCTION-Anweisung erzeugt und kompiliert. Nur fehlerfrei angelegte Funktionen können ausgeführt werden. Im Gegensatz zur Prozedur verfügt eine Funktion immer über (wenigstens) einen Rückgabewert. Dessen Datentyp wird in Form der RETURN-Klausel spezifiziert.

Die Spezifikation von Parametern ist optional. Beim Aufruf werden die Eingabe- sowie die Ein-/Ausgabe-Parameter von der aufrufenden Umgebung in die Funktion übergeben, dann wird die Funktion sequentiell von oben nach unten abgearbeitet, bis sie auf eine RETURN-Anweisung stößt und dort terminiert.
Klassischer Weise wird eine Funktion in Abgrenzung zu einer Prozedur mit keinen, einem, mehreren Eingabeparametern und einem Rückgabewert (RETURN-Klausel) definiert. Grundsätzlich ist es aber auch bei einer Funktion möglich, beliebige Ausgabe- sowie Ein-/Ausgabe-Parameter zu programmieren - nur irgendwie verschwischen an dieser Stelle dann die beiden Konzepte etwas.

Der Aufruf einer gespeicherten Funktion kann aus anderen gespeicherten Prozeduren und Funktionen, PL/SQL-Blöcken, TRIGGERN erfolgen, ebenso aus in interaktiven Ausführungsumgebungen wie z.B. Oracle SQL-Plus oder dem Oracle SQL-Developer heraus. Da die Funktion ja über die RETURN-Klausel verfügt, muss der Aufruf immer in einer Art erfolgen, die es ermöglicht, den Rückgabewert "irgendwo zu lassen". Eine Möglichkeit ist in Zuweisungen (Zuweisungsoperator :=) oder in SELECT- oder WHERE-Klauseln von SELECT-Abfragen, in Bedingungen von IF-Anweisungen oder Schleifen (WHILE-Schleife).

Variablen- und Konstanten-Deklarationen erfolgen optional im Anschluss an das IS analog wie in anderen PL/SQL-Blöcken auch (DECLARE).

Als Anweisungen im Ausführungsteil sind alle PL/SQL-Befehle zugelassen, die SQL-DML-Anweisungen INSERT, UPDATE, DELETE? ohne Veränderungen an der SQL-Syntax, die SQL-DQL-Anweisung SELECT mit der INTO-Klausel (SELECT-INTO) oder als CURSOR-Anfrage sowie COMMIT und ROLLBACK. Eine Funktion muss wenigstens über eine, kann aber auch über mehrere RETURN-Anweisungen verfügen, um die Funktionsausführung zu terminieren.

Syntax der CREATE FUNCTION-Anweisung:

   <CREATE FUNCTION Anweisung> ::=
      CREATE [ OR REPLACE ] FUNCTION Name
             [ ( <Parameterdefinition> [ , <Parameterdefinition> ]... ) ]
      RETURN <Datentyp>
      IS
             [ <Deklaration>; [ <Deklaration>; ]... ]
      [PRAGMA-AUTONOMOUS-TRANSACTION]
      BEGIN
             <SQL- und PL/SQL-Anweisung>; [ <SQL- und PL/SQL-Anweisung>; ]...
      [ EXCEPTION
             <Fehlerbehandlung> ]
      END;

   <RETURN Anweisung> ::= RETURN { <Variable> | <Konstante> | <Ausdruck> };

   <SQL- und PL/SQL-Anweisung> := <SQL-Anweisung> | <PL/SQL-Anweisung>

Beispiel:

   CREATE OR REPLACE FUNCTION  Mitteln_f (p_x IN NUMBER, p_y IN NUMBER)
   RETURN NUMBER
   IS
   BEGIN
     RETURN (p_x + p_y) / 2;
   END;

   -- Servervariable SERVEROUTPUT muss angestellt sein
   SET SERVEROUTPUT ON

   -- Aufruf mittels Zuweisung
   v_mittel := mitteln_f (v_zahl1, v_zahl2); 

   --EXECUTE ersetzt einen anonymen Block, bei einer Funktion mit  Zuweisung in eine Bindevariable
   VARIABLE XYZ number;
   EXECUTE :XYZ:=  mitteln_f(16,46);
   PRINT XYZ;

   -- Aufruf mittels SELECT-Anweisung und DUAL-Tabelle
   SELECT mitteln_f(16,46) FROM Dual;

   -- Aufruf in einem anonymen Block
   DECLARE
   VARIABLE XYZ number;
   BEGIN
      :XYZ:=  mitteln_f(16,46);
      PRINT XYZ; 
   END;
   /

siehe auch: Prozedur

Quellen:

  • Faeskorn-Woyke, Heide; Bertelsmeier, Birgit; Riemer, Petra; Bauer, Elena: "Datenbanksysteme - Theorie und Praxis mit SQL2003, Oracle und MySQL", Pearson Education, München, 2007, ISBN 978-3-8273-7266-6
  • Feuerstein, Steven, Pribyl. Bill: "Oracle PL/SQL Programming", O'Reilly, 2009, ISBN-13: 978-0596514464
  • Oracle® Database SQL Language Reference 11g Release 1 (11.1) in http://docs.oracle.com/cd/B28359_01/server.111/b28286/toc.htm
  • Oracle® Database PL/SQL Language Reference 11g Release 2 (11.2) in http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/toc.htm
  • Saurabh, Gupta: "Oracle Advanced PL/SQL Developer Professional Guide", Packt Publishing Limited, 2012, ISBN 978-1-84968-722-5

Kategorie: Oracle-PL-SQL, C