Oracle Pipelined Table Functions
drop TABLE test_table; drop PACKAGE test_pkg; CREATE TABLE test_table(tt_id INTEGER,tt_text VARCHAR2(40)); CREATE PACKAGE test_pkg IS TYPE tp_rec IS RECORD(tt_id INTEGER,tt_text VARCHAR2(40)); TYPE tp_recs IS TABLE OF tp_rec; FUNCTION test_func RETURN tp_recs PIPELINED; FUNCTION test_func1 RETURN tp_recs PIPELINED; FUNCTION test_func2(ivar INTEGER) RETURN tp_recs PIPELINED; END; / CREATE OR REPLACE PACKAGE BODY test_pkg IS FUNCTION test_func RETURN tp_recs PIPELINED AS currec tp_rec; BEGIN currec.tt_id := 1; currec.tt_text := 'test1'; PIPE ROW(currec); END; FUNCTION test_func1 RETURN tp_recs PIPELINED AS currec tp_rec; CURSOR t_cursor IS SELECT * FROM test_table; BEGIN OPEN t_cursor; LOOP FETCH t_cursor INTO currec; EXIT WHEN t_cursor%NOTFOUND; PIPE ROW(currec); END LOOP; CLOSE t_cursor; END; FUNCTION test_func2(ivar INTEGER) RETURN tp_recs PIPELINED AS currec tp_rec; BEGIN SELECT * INTO currec FROM test_table WHERE tt_id = ivar; PIPE ROW(currec); END; END; / BEGIN INSERT INTO test_table VALUES(1,'test1'); INSERT INTO test_table VALUES(2,'test2'); INSERT INTO test_table VALUES(3,'test3'); COMMIT; END; / SELECT * FROM TABLE(test_pkg.test_func()); SELECT * FROM TABLE(test_pkg.test_func1()); SELECT * FROM TABLE(test_pkg.test_func2(2));
drop PACKAGE PIPELINED_FUN_TEST_PKG; CREATE OR REPLACE PACKAGE PIPELINED_FUN_TEST_PKG AS TYPE NUMBER_TBL_TYPE IS TABLE OF NUMBER; FUNCTION EXAMPLE1(V_MAX_NUMBER NUMBER) RETURN NUMBER_TBL_TYPE PIPELINED; END PIPELINED_FUN_TEST_PKG; CREATE OR REPLACE PACKAGE BODY PIPELINED_FUN_TEST_PKG AS FUNCTION EXAMPLE1(V_MAX_NUMBER NUMBER) RETURN NUMBER_TBL_TYPE PIPELINED IS BEGIN FOR i IN 1..V_MAX_NUMBER LOOP PIPE ROW(i); END LOOP; RETURN; END; END PIPELINED_FUN_TEST_PKG; SELECT * FROM TABLE(PIPELINED_FUN_TEST_PKG.EXAMPLE1(:X))