1 rem -----------------------------------------------------------------------
2 rem URL: http://www.orafaq.com/scripts/plsql/refcurs.txt
3 rem Filename: refcurs.sql
4 rem Purpose: Pass result sets (REF CURSOR) between procedures and
7 rem Author: Frank Naude (frank@ibi.co.za)
8 rem -----------------------------------------------------------------------
12 -- Define TYPES package separately to be available to all programming
14 CREATE OR REPLACE PACKAGE types AS
15 TYPE cursortyp is REF CURSOR; -- use weak form
19 -- Create test package to demonstrate passing result sets...
20 CREATE OR REPLACE PACKAGE test_ref_cursor AS
22 FUNCTION get_cursor_ref(typ NUMBER) RETURN types.cursortyp;
23 PROCEDURE process_cursor(cur types.cursortyp);
29 CREATE OR REPLACE PACKAGE BODY test_ref_cursor AS
31 -- Main program entry point
34 process_cursor( get_cursor_ref(1) );
35 process_cursor( get_cursor_ref(2) );
38 -- Get and return a CURSOR REF/ Result Set
39 FUNCTION get_cursor_ref(typ NUMBER) RETURN types.cursortyp IS
43 OPEN cur FOR SELECT * FROM emp WHERE ROWNUM < 5;
45 OPEN cur FOR SELECT * FROM dept WHERE ROWNUM < 5;
50 -- Process rows for an EMP or DEPT cursor
51 PROCEDURE process_cursor(cur types.cursortyp) IS
56 FETCH cur INTO empRec; -- Maybe it was an EMP cursor, try to fetch...
57 EXIT WHEN cur%NOTFOUND;
58 dbms_output.put_line('EMP ROW: '||empRec.ename);
61 WHEN ROWTYPE_MISMATCH THEN -- OK, so it was't EMP, let's try DEPT.
63 FETCH cur INTO deptRec;
64 EXIT WHEN cur%NOTFOUND;
65 dbms_output.put_line('DEPT ROW: '||deptRec.dname);
74 EXEC test_ref_cursor.main;