Trusted answers to developer questions
Trusted Answers to Developer Questions

Related Tags


How to create a database cursor in SQL

Arslan Bajwa

In SQL, cursors are used to iterate row-wise over a result set. This iteration works the same way as the iterators in lists and other data structures. It acts as a pointer and is used to retrieve or update data of each row of a query.

Types of cursors

SQL supports different types of cursors – they are:

1. Static: This cursor creates a copy of data. In order to see the effect of data operations and changes, the cursor must be closed and then reopened.

2. Dynamic: Unlike static cursors, dynamic cursors allow us to see the effect of data operations and changes in real-time.

3. Fast_forward: This is the fastest cursor used to traverse through the data in the forwarding direction only. It does not allow data modifications.

4. Keyset: It creates a temporary table to store unique identifiers of records in record set. It also reflects on the changes made to non-key values in the records.

The lifecycle of a cursor

The complete lifecycle of an SQL cursor is:

1. Declare

First, we DECLARE a cursor object by assigning it a name and a SELECT statement.


DECLARE name_of_cursor CURSOR
 [LOCAL | GLOBAL]           -- define scope of the cursor
 [FORWARD_ONLY | SCROLL]    -- define movement type of the cursor
 [STATIC | DYNAMIC | FAST_FORWARD | KEYSET]    --define type of cursor  
 [SCROLL_LOCKS | OPTIMISTIC |READ_ONLY]  -- define locks if any
FOR SELECT * from name_of_table

2. Open

Then, we OPEN a cursor by allocating it a memory to fetch and storing the data retrieved from the result set.


OPEN name_of_cursor

3. Fetch

After we open the cursor, we can FETCH rows from the cursor by accessing one row at a time. SQL has the following two movement options to fetch data:

  1. FORWARD_ONLY: The cursor can only access data in a forward direction from the first to the last row. It only allows the use of the FETCH NEXT statement.

  2. SCROLL: The cursor can move in any of the following six directions to access data:

    1. NEXT: Fetches the next row of the cursor table.
    2. PRIOR: Fetches the previous row of the cursor table.
    3. FIRST: Fetches the first row of the cursor table.
    4. LAST: Fetches the last row of the cursor table.
    5. ABSOLUTE n: Fetches the nth row of the cursor table.
    6. RELATIVE n: Fetches an nth row from the current position of the cursor table.


FETCH NEXT FROM name_of_cursor
FETCH PRIOR FROM name_of_cursor
FETCH FIRST FROM name_of_cursor
FETCH LAST FROM name_of_cursor
FETCH ABSOLUTE number_of_element FROM name_of_cursor
FETCH RELATIVE number_of_element FROM name_of_cursor
-- negative number_of_element means moving backward

4. Close

After fetching the data, we explicitly CLOSE the cursor. The cursor can be reopened after closing.


CLOSE name_of_cursor

5. Deallocate

In the end, we DEALLOCATE the cursor to deallocate all associated system resources and cursor definition. After deallocating, the cursor cannot be reopened.


DEALLOCATE name_of_cursor

The following is an example of the process:

CREATE TABLE students(  
    student_id int NOT NULL PRIMARY KEY,  
    student_name varchar(50) NOT NULL

FOR SELECT student_id, student_name
FROM students

OPEN student_cursor

FETCH LAST FROM student_cursor


  FETCH PRIOR FROM student_cursor

CLOSE student_cursor

DEALLOCATE student_cursor



View all Courses

Keep Exploring