Cursors

  • Rows returned by the SQL query are those which match the condition. It can either be zero or more at a time.

  • Sometimes you need to traverse through the rows one by one, forward or backwards

  • Life Cycle of Cursor

    • DECLARE

    • OPEN

    • FETCH

    • CLOSE

  • Cursor enable SQL to retrieve ( or update, or delete ) a single row at a time.

  • Cursor needs to be created in

DECLARE cur_al_movie refcursor;

-- or

cursor-name [cursor-scrollability] cursor [(name datatype ...)]
FOR
    query-expression
  • cursor-scrollability : SCROLL OR NO SCROLL, NO SCROLL mean the cursor cannot scrol backward.

  • query-expression : You can use any legal SELECT statement as a query expression. The result set rows are considered as scope of the cursor.

Example

DECLARE cur_all_movies CURSOR
    FOR
        SELECT movie_name, movie_length FROM movies;

Cursor with Parameters

DECLARE cur_all_movies_by_year CURSOR ( custom_year integer )
FOR
    SELECT  
        *
    FROM movies
    WHERE EXTRACT ('YEAR' FROM release_date ) = custom_year

Opening a cursor

  • Opening an unbound cursor

OPEN unbound_cursor_variable [[NO] SCROLL] FOR query;

Opening un bound cursor

OPEN cur_directors_us
FOR
    SELECT
        first_name,
        last_name,
        date_of_birth
    FROM
        directors
    WHERE
        nationality = 'American'

Opening an un bound cursor with dynamic query

OPEN unbound_cursor_variable [[NO] SCROLL]
FOR EXECUTE
    query-expression [using expression [,...]];
select * from movies order by movie_name;

DO
$$

    DECLARE
        output_text text default '';
        rec_movie record;

        cur_all_movies CURSOR
        FOR
            SELECT * FROM movies;

    BEGIN

        OPEN cur_all_movies;

        LOOP

            FETCH cur_all_movies into rec_movie;
                EXIT WHEN NOT FOUND;

            output_text := output_text || ',' || rec_movie.movie_name;

        END LOOP;

        RAISE NOTICE 'ALL MOVIES NAME %' , output_text;

    END;

$$


    

Last updated