Pipelined table function -- Create the types to support the table function. DROP TYPE TNAME; DROP TYPE TNAME1; CREATE TYPE tname AS OBJECT ( id NUMBER, description VARCHAR2(50) ); / CREATE TYPE tname1 IS TABLE OF tname; / -- Build the table function itself. CREATE OR REPLACE FUNCTION F1 (i IN NUMBER) RETURN TNAME1 AS l_tab TNAME1 := TNAME1(); BEGIN FOR X IN 1 .. i LOOP l_tab.extend; l_tab(l_tab.last) := tname(X, 'Description for ' || X); END LOOP; RETURN l_tab; END; / -- Test it. SELECT * FROM TABLE(F1(3)) ORDER BY id DESC; ID DESCRIPTION ---------- -------------------------------------------------- 3 Description for 3 2 Description for 2 1 Description for 1 3 rows selected. SQL> -- Build a pipelined table function. CREATE OR REPLACE FUNCTION F2 (i IN NUMBER) RETURN TNAME1 PIPELINED AS BEGIN FOR X IN 1 .. i LOOP PIPE ROW(TNAME(X, 'Description for ' || X)); END LOOP; RETURN; END; / -- Test it. SELECT * FROM TABLE(F2(3));