Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Cursor

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 6

7

\Introducing to PL/SQL Cursor


When you work with Oracle database, you work with a complete set of rows returned from an SQL
SELECT statement. However the application in some cases cannot work effectively with the entire result
set, therefore, the database server needs to provide a mechanism for the application to work with one row
or a subset of the result set at a time. As the result, Oracle created PL/SQL cursor to provide these
extensions.

A PL/SQL cursor is a pointer that points to the result set of an SQL query against database tables.

Working with PL/SQL Cursor


The following picture describes steps that you need to follow when you work with a PL/SQL cursor:

PL/SQL
Cursor
Let’s examine each step in greater detail.

Declaring PL/SQL Cursor


To use PL/SQL cursor, first you must declare it in the declaration section of PL/SQL block or in
a package as follows:

1 CURSOR cursor_name [ ( [ parameter_1 [, parameter_2 ...] ) ]


2 [ RETURN return_specification ]
3 IS sql_select_statements
4 [FOR UPDATE [OF [column_list]];

 First, you declare the name of the cursor cursor_name after the CURSOR keyword. The name of the
cursor can have up to 30 characters in length and follows the naming rules of identifiers in PL/SQL.
It is important to note that cursor’s name is not a variable so you cannot use it as a variable such as
assigning it to other cursor or using it in an expression. The parameter1,parameter2… are
optional elements in the cursor declaration. These parameters allow you to pass arguments into the
cursor. The RETURN return_specification is also an optional part.
 Second, you specify a valid SQL statement that returns a result set where the cursor points to.

 Third, you can indicate a list of columns that you want to update after the FOR UPDATE OF. This part
is optional so you can omit it in the CURSOR declaration.
Here is an example of declaring a cursor:

1 CURSOR cur_chief IS
2 SELECT first_name,
3 last_name,
4 department_name
5 FROM employees e
6 INNER JOIN departments d ON d.manager_id = e.employee_id;
We retrieved data from employees and departments tables using the SELECTwith the INNER JOIN clause
and set the cur_chief cursor to this result set.
Opening a PL/SQL Cursor
After declaring a cursor, you can open it by using the following syntax:

1 OPEN cursor_name [ ( argument_1 [, argument_2 ...] ) ];


You have to specify the cursor’s name cursor_name after the keyword OPEN. If the cursor was defined
with a parameter list, you need to pass corresponding arguments to the cursor.
When you OPEN the cursor, PL/SQL executes the SQL SELECT statement and identifies the active
result set. Notice that the OPEN action does not actually retrieve records from the database. It happens in
the FETCH step. If the cursor was declared with the FOR UPDATE clause, PL/SQL locks all the records in
the result set.
We can open the cur_chief cursor as follows:

1 OPEN cur_chief;

Fetching Records from PL/SQL Cursor


Once the cursor is open, you can fetch data from the cursor into a record that has the same structure as
the cursor. Instead of fetching data into a record, you can also fetch data from the cursor to a list
of variables.

The fetch action retrieves data and fills the record or the variable list. You can manipulate this data in
memory. You can fetch the data until there is no record found in active result set.

The syntax of FETCH is as follows:


1 FETCH cursor_name INTO record or variables
You can test the cursor’s attribute %FOUND or %NOTFOUND to check if the fetch against the cursor is
succeeded. The cursor has more attributes that we will cover in the next section.
We can use PL/SQL LOOP statement together with the FETCH to loop through all records in active result
set as follows:

1 LOOP
2 -- fetch information from cursor into record
3 FETCH cur_chief INTO r_chief;
4
5 EXIT WHEN cur_chief%NOTFOUND;
6
7 -- print department - chief
8 DBMS_OUTPUT.PUT_LINE(r_chief.department_name || ' - ' ||
9 r_chief.first_name || ',' ||
10 r_chief.last_name);
11 END LOOP;

Closing PL/SQL Cursor


You should always close the cursor when it is no longer used. Otherwise, you will have a memory leak in
your program, which is not expected.

To close a cursor, you use CLOSE statement as follows:

1 CLOSE cursor_name;
And here is an example of closing the cur_chief cursor:

1 CLOSE cur_chief;

A complete PL/SQL Cursor Example


The following is a complete example of cursor for printing a list of chief and name of departments as
follows:

1 SET SERVEROUTPUT ON SIZE 1000000;


2 DECLARE
3 -- declare a cursor
4 CURSOR cur_chief IS
5 SELECT first_name,
6 last_name,
7 department_name
8 FROM employees e
9 INNER JOIN departments d ON d.manager_id = e.employee_id;
10
11 r_chief cur_chief%ROWTYPE;
12 BEGIN
13 OPEN cur_chief;
14 LOOP
15 -- fetch information from cursor into record
16 FETCH cur_chief INTO r_chief;
17
18 EXIT WHEN cur_chief%NOTFOUND;
19
20 -- print department - chief
21 DBMS_OUTPUT.PUT_LINE(r_chief.department_name || ' - ' ||
22 r_chief.first_name || ',' ||
23 r_chief.last_name);
24 END LOOP;
25 -- close cursor cur_chief
26 CLOSE cur_chief;
27 END;
28 /

PL/SQL Cursor Attributes


These are the main attributes of a PL/SQL cursor and their descriptions.

Attribute Description

cursor_name%FOUND returns TRUE if record was fetched successfully by cursor cursor_name

cursor_name%NOTFOUND returns TRUE if record was not fetched successfully by cursor cursor_name
cursor_name%ROWCOUNT returns the number of records fetched from the cursor cursor_name at the time
we test %ROWCOUNT attribute
cursor_name%ISOPEN returns TRUE if the cursor cursor_name is open
“}

You might also like