|
FETCH a cursor: FETCH cursor_name INTO [variable1, variable2,...] | record_name; The variables must match (both in number and positionally) the columns listed in the cursor definition. Also the data types must either match or be compatible. A fetch statement retrieves rows one at a time from the result set of a multi-row query - in other words it advances the cursor to the next row. CLOSE a cursor: CLOSE cursor_name; Closing a cursor releases the context area. Cursor Attributes: cursor%ROWCOUNT - int - number of rows affected by last SQL statement cursor%FOUND - bool - TRUE if >1 row returned cursor%NOTFOUND - bool - TRUE if 0 rows returned cursor%ISOPEN - bool - TRUE if cursor still open Examples: --Opening a cursor only if necessary IF NOT trip_cursor%ISOPEN THEN OPEN trip_cursor END IF; --Fetching a maximum of 20 records (or less if the table is smaller) DECLARE v_trip_id business_trips.bt_id_pk%TYPE; v_hotel_id business_trips.bt_hotel_id%TYPE; CURSOR trip_cursor IS SELECT bt_id_pk, bt_hotel_id FROM business_trips; BEGIN OPEN trip_cursor; LOOP FETCH trip_cursor INTO v_trip_id, v_hotel_id; EXIT WHEN trip_cursor%ROWCOUNT > 20 OR trip_cursor%NOTFOUND; ... END LOOP; CLOSE trip_cursor; END; --Taking this a step further by fetching into a ROWTYPE Record variable DECLARE CURSOR trip_cursor IS SELECT bt_id_pk, bt_hotel_id FROM business_trips; trip_record trip_cursor%ROWTYPE BEGIN OPEN trip_cursor; LOOP FETCH trip_cursor INTO trip_record; EXIT WHEN trip_cursor%NOTFOUND; INSERT INTO copy_of_business_trips (bt_id_pk, bt_hotel_id) VALUES (trip_record.bt_id_pk, trip_record.bt_hotel_id); END LOOP; CLOSE job_cursor; END; --Retrieve all trips from the t_business_trips table using a cursor and print only those with a duration of one day: SET SERVEROUTPUT ON DECLARE CURSOR trip_cursor IS SELECT bt_id_pk, bt_duration FROM business_trips; BEGIN FOR trip_record IN trip_cursor LOOP -- implicit open/fetch occur IF trip_record.bt_duration = 1 THEN DBMS_OUTPUT_LINE ('Trip Number ' || trip_record.bt_id_pk || ' is a one day trip'); END IF; END LOOP; -- IMPLICIT CLOSE OCCURS END; / --In reality this last example would be better written as the trivial SQL statement: SELECT 'Trip Number ' || bt_id_pk || ' is a one day trip' FROM business_trips WHERE bt_duration = 1;
Related Commands:
Fetch and CLOSE a REF cursor
Related Views: