Zu Oracle

Bereich:
Versionsinfo:
PL/SQL
9.2, 10.2, 11.1
Erstellung:
Letzte Überarbeitung:
01/2003 HA
06/2009 HA
 Als PDF Downloaden!

Pipelined Table Functions

Seit Version 9.2 ist es möglich, die Werte nicht mehr als komplettes Array zurückzugeben, sondern zeilenweise; dies bezeichnet man dann als Pipelined Table Functions. Zu diesem Zweck wurde die Syntax erweitert:

  • Im CREATE-Befehl muss zusätzlich das Schlüsselwort PIPELINED stehen
  • Einzelne Zeilen können mit PIPE ROW zurückgegeben werden
  • In Version 10g sollte man eine RETURN-Anweisung ohne Rückgabewert hinzufügen, um das Ende der Verarbeitung anzuzeigen.
    In Version  9.2 ist dies Pflicht, sonst führt der Aufruf zu einem Fehler (ORA-06503).

Der Vorteil der Pipelined Table Functions liegt darin, dass die Anzeige bzw. Weiterverarbeitung beschleunigt werden kann; die aufrufende Umgebung braucht nicht mehr darauf zu warten, dass die Funktion komplett abgearbeitet wurde.
Außerdem kann der Speicherbedarf reduziert werden, da nur einzelne Zeilen zwischengespeichert  und übergeben werden, nicht eine komplette Collection.

An der Syntax zum Aufruf ändert sich dabei nichts.

Unser Beispiel für table functions würde als Pipelined Table Function folgendermaßen aussehen:

CREATE TYPE dept_info AS TABLE OF VARCHAR2(1000);
/
CREATE OR REPLACE PACKAGE cursor_pack
   IS
       TYPE ref_cur IS REF CURSOR;
END;
/

CREATE OR REPLACE FUNCTION dept_table_function
    ( p_cur in cursor_pack.ref_cur)
RETURN dept_info PIPELINED IS
    v_table   VARCHAR2(1000);
    v_deptno  dept.deptno%TYPE;
    v_dname   dept.dname%TYPE;
    v_loc     dept.loc%TYPE;
    i         NUMBER:= 0;
BEGIN
   LOOP
      i:= i+1;
      FETCH p_cur INTO v_deptno, v_dname, v_loc;
      EXIT WHEN p_cur%NOTFOUND;
      v_table :=
      'Abteilung '||v_deptno||' ('||v_dname||') befindet sich in '||v_loc;
      PIPE ROW (v_table);
   END LOOP;
   CLOSE p_cur;
   RETURN;
END;
/

SELECT * FROM
TABLE(dept_table_function(CURSOR(SELECT deptno, dname, loc FROM dept)));

Suche

Kontakt

Telefon:
  089 6228 6789-0

Telefon (noch gültig):
  089 679090-40

E-Mail Verteiler Monatstipps

Bitte nehmen Sie mich in den Verteiler der monatlichen Tipps & Tricks auf.