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:
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)));
Bitte nehmen Sie mich in den Verteiler der monatlichen Tipps & Tricks auf.