Oracle 10g Cursor Concepts
Oracle 10g Cursor Concepts
Selvaraj V
Anna University Chennai.
Chennai – 25.
Cursors:
Implicit : More fast and less coding effort. Will never raise INVALID_CURSOR
error Cannot be opened outside the statement Raises NO_DATA_FOUND and
TOO_MANY_ROWS exceptions (eg: select <stmt>)
Implicit cursor returning more than one record? FOR LOOP cursors.
Explicit : 2 network round trips. Store data first then retrieve data. More
programmatic control.
3. Cursor attributes
Explicit:
open c1; -- cursor c1 is select
<stmt>
fetch <>
exit when c1%NOTFOUND
Declare
Cursor cur1 is
select ename,empno,sal from emp
where empno between 9000 and 1000
and sal<50000
and deptno=50
begin
open cur1;
---<do processing>
close cur1;
end;
CURSOR
For every SQL statement execution certain area in memory is allocated. PL/SQL
allow you to name this area. This private SQL area is called context area or cursor. A
cursor acts as a handle or pointer into the context area. A PL/SQL program controls
the context area using the cursor. Cursor represents a structure in memory and is
different from cursor variable.
When you declare a cursor, you get a pointer variable, which does not point any
thing. When the cursor is opened, memory is allocated and the cursor structure is
created. The cursor variable now points the cursor. When the cursor is closed the
memory allocated for the cursor is released.
Cursors allow the programmer to retrieve data from a table and perform actions on
that data one row at a time. There are two types of cursors implicit cursors and
explicit cursors.
Implicit cursors
For SQL queries returning single row PL/SQL declares implicit cursors. Implicit
cursors are simple SELECT statements and are written in the BEGIN block
(executable section) of the PL/SQL. Implicit cursors are easy to code, and they
retrieve exactly one row. PL/SQL implicitly declares cursors for all DML statements.
The most commonly raised exceptions here are NO_DATA_FOUND or
TOO_MANY_ROWS.
Syntax:
SELECT ename, sal INTO ena, esa FROM EMP WHERE EMPNO = 7844;
Note: Ename and sal are columns of the table EMP and ena and esa are the variables
Explicit cursors are used in queries that return multiple rows. The set of rows fetched
by a query is called active set. The size of the active set meets the search criteria in
the select statement. Explicit cursor is declared in the DECLARE section of PL/SQL
program.
Syntax:
Sample Code:
DECLARE
CURSOR emp_cur IS SELECT ename FROM EMP;
BEGIN
----
---
END;
Processing multiple rows is similar to file processing. For processing a file you need
to open it, process records and then close. Similarly user-defined explicit cursor
needs to be opened, before reading the rows, after which it is closed. Like how file
pointer marks current position in file processing, cursor marks the current position in
the active set.
Opening Cursor
When a cursor is opened the active set is determined, the rows satisfying the where
clause in the select statement are added to the active set. A pointer is established
and points to the first row in the active set.
Fetching from the cursor: To get the next row from the cursor we need to use fetch
statement.
FETCH statement retrieves one row at a time. Bulk collect clause need to be used to
fetch more than one row at a time.
Closing the cursor: After retrieving all the rows from active set the cursor should be
closed. Resources allocated for the cursor are now freed. Once the cursor is closed
the execution of fetch statement will lead to errors.
CLOSE <cursor-name>;
Every cursor defined by the user has 4 attributes. When appended to the cursor
name these attributes let the user access useful information about the execution of a
multirow query.
While LOOP can be used as shown in the following example for accessing the cursor
values.
Example:
Fetch is used twice in the above example to make %FOUND available. See below
example.
Using Cursor For Loop:
The cursor for Loop can be used to process multiple records. There are two benefits
with cursor for Loop
In all the previous examples I explained about how to retrieve data using cursors.
Now we will see how to modify or delete rows in a table using cursors. In order to
Update or Delete rows, the cursor must be defined with the FOR UPDATE clause. The
Update or Delete statement must be declared with WHERE CURRENT OF
Following example updates comm of all employees with salary less than 2000 by
adding 100 to existing comm.