Packaging Cursors
You can split a cursor specification from its body for placement in a package. In that way, you can change the cursor body without changing the cursor specification. You can code the cursor specification in the package specification using the syntax as shown below:
CURSOR cursor_name [(parameter[, parameter]...)] RETURN return_type;
In the illustration below, you use the %ROWTYPE attribute to provide a record type which presents a row in the database table emp:
CREATE PACKAGE emp_actions AS
/* Declare cursor spec. */
CURSOR c1 RETURN emp%ROWTYPE;
...
END emp_actions;
CREATE PACKAGE BODY emp_actions AS
/* Define cursor body. */
CURSOR c1 RETURN emp%ROWTYPE IS
SELECT * FROM emp
WHERE sal > 3000;
...
END emp_actions;
The cursor specification has no SELECT statement as the RETURN clause defines the datatype of the result value. Though, the cursor body should have a SELECT statement and the similar RETURN clause as the cursor specification. Also, the number& datatypes of items in the SELECT list and the RETURN clause should match.
The Packaged cursors increase the flexibility. For illustration, you can change the cursor body in the last illustration, as shown, without having to change the cursor specification:
CREATE PACKAGE BODY emp_actions AS
/* Define cursor body. */
CURSOR c1 RETURN emp%ROWTYPE IS
SELECT * FROM emp
WHERE deptno = 20; -- new WHERE clause
...
END emp_actions;