Você está na página 1de 24

Objectives

After completing this lesson, you should be able to do the


following:
Distinguish between implicit and explicit cursors
Discuss the reasons for using explicit cursors
Declare and control explicit cursors
Use simple loops and cursor FOR loops to fetch data
Declare and use cursors with parameters
Lock rows with the FOR UPDATE clause
Reference the current row with the WHERE CURRENT OF
clause

7-1

Copyright 2007, Oracle. All rights reserved.

Cursors
Every SQL statement executed by the Oracle server has an
associated individual cursor:
Implicit cursors: Declared and managed by PL/SQL for all
DML and PL/SQL SELECT statements
Explicit cursors: Declared and managed by the programmer

7-2

Copyright 2007, Oracle. All rights reserved.

Explicit Cursor Operations

Table

100 King
Active set

7-3

AD_PRES

101 Kochhar AD_VP


102 De Haan AD_VP
.

139 Seo

ST_CLERK

140 Patel

ST_CLERK

Copyright 2007, Oracle. All rights reserved.

Controlling Explicit Cursors

No

DECLARE

OPEN

FETCH

Create a Identify the Load the


named
SQL area.

active set.

current
row into
variables.

EMPTY?

Test for
existing
rows.

Return to
FETCH if
rows are
found.

7-4

Yes

Copyright 2007, Oracle. All rights reserved.

CLOSE

Release the
active set.

Controlling Explicit Cursors

Open the cursor.


Cursor
pointer

Fetch a row.
Cursor
pointer

7-5

Close the cursor.

Copyright 2007, Oracle. All rights reserved.

Cursor
pointer

Declaring the Cursor


Syntax:
CURSOR cursor_name IS
select_statement;

Examples:
DECLARE
CURSOR c_emp_cursor IS
SELECT employee_id, last_name FROM employees
WHERE department_id =30;
DECLARE
v_locid NUMBER:= 1700;
CURSOR c_dept_cursor IS
SELECT * FROM departments
WHERE location_id = v_locid;
...
7-6

Copyright 2007, Oracle. All rights reserved.

Opening the Cursor

DECLARE
CURSOR c_emp_cursor IS
SELECT employee_id, last_name FROM employees
WHERE department_id =30;
...
BEGIN
OPEN c_emp_cursor;

7-8

Copyright 2007, Oracle. All rights reserved.

Fetching Data from the Cursor


DECLARE
CURSOR c_emp_cursor IS
SELECT employee_id, last_name FROM employees
WHERE department_id =30;
v_empno employees.employee_id%TYPE;
v_lname employees.last_name%TYPE;
BEGIN
OPEN c_emp_cursor;
FETCH c_emp_cursor INTO v_empno, v_lname;
DBMS_OUTPUT.PUT_LINE( v_empno ||' '||v_lname);
END;
/

7-9

Copyright 2007, Oracle. All rights reserved.

Fetching Data from the Cursor


DECLARE
CURSOR c_emp_cursor IS
SELECT employee_id, last_name FROM employees
WHERE department_id =30;
v_empno employees.employee_id%TYPE;
v_lname employees.last_name%TYPE;
BEGIN
OPEN c_emp_cursor;
LOOP
FETCH c_emp_cursor INTO v_empno, v_lname;
EXIT WHEN c_emp_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE( v_empno ||' '||v_lname);
END LOOP;
END;
/

7 - 11

Copyright 2007, Oracle. All rights reserved.

Closing the Cursor

...
LOOP
FETCH c_emp_cursor INTO empno, lname;
EXIT WHEN c_emp_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE( v_empno ||' '||v_lname);
END LOOP;
CLOSE c_emp_cursor;
END;
/

7 - 12

Copyright 2007, Oracle. All rights reserved.

Cursors and Records


Process the rows of the active set by fetching values into a
PL/SQL record.
DECLARE
CURSOR c_emp_cursor IS
SELECT employee_id, last_name FROM employees
WHERE department_id =30;
v_emp_record c_emp_cursor%ROWTYPE;
BEGIN
OPEN c_emp_cursor;
LOOP
FETCH c_emp_cursor INTO v_emp_record;
EXIT WHEN c_emp_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE( v_emp_record.employee_id
||' '||v_emp_record.last_name);
END LOOP;
CLOSE c_emp_cursor;
END;
7 - 13

Copyright 2007, Oracle. All rights reserved.

Cursor FOR Loops


Syntax:
FOR record_name IN cursor_name LOOP
statement1;
statement2;
. . .
END LOOP;

The cursor FOR loop is a shortcut to process explicit cursors.


Implicit open, fetch, exit, and close occur.
The record is implicitly declared.

7 - 14

Copyright 2007, Oracle. All rights reserved.

Cursor FOR Loops

DECLARE
CURSOR c_emp_cursor IS
SELECT employee_id, last_name FROM employees
WHERE department_id =30;
BEGIN
FOR emp_record IN c_emp_cursor
LOOP
DBMS_OUTPUT.PUT_LINE( emp_record.employee_id
||' ' ||emp_record.last_name);
END LOOP;
END;
/

7 - 15

Copyright 2007, Oracle. All rights reserved.

Explicit Cursor Attributes


Use explicit cursor attributes to obtain status information about
a cursor.
Attribute

Type

Description

%ISOPEN

Boolean

Evaluates to TRUE if the cursor is open

%NOTFOUND

Boolean

Evaluates to TRUE if the most recent fetch


does not return a row

%FOUND

Boolean

Evaluates to TRUE if the most recent fetch


returns a row; complement of %NOTFOUND

%ROWCOUNT

Number

Evaluates to the total number of rows returned


so far

7 - 16

Copyright 2007, Oracle. All rights reserved.

%ISOPEN Attribute
Fetch rows only when the cursor is open.
Use the %ISOPEN cursor attribute before performing a fetch
to test whether the cursor is open.
Example:
IF NOT c_emp_cursor%ISOPEN THEN
OPEN c_emp_cursor;
END IF;
LOOP
FETCH c_emp_cursor...

7 - 17

Copyright 2007, Oracle. All rights reserved.

%ROWCOUNT and %NOTFOUND: Example


DECLARE
CURSOR c_emp_cursor IS SELECT employee_id,
last_name FROM employees;
v_emp_record c_emp_cursor%ROWTYPE;
BEGIN
OPEN c_emp_cursor;
LOOP
FETCH c_emp_cursor INTO v_emp_record;
EXIT WHEN c_emp_cursor%ROWCOUNT > 10 OR
c_emp_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE( v_emp_record.employee_id
||' '||v_emp_record.last_name);
END LOOP;
CLOSE c_emp_cursor;
END ;
/

7 - 18

Copyright 2007, Oracle. All rights reserved.

Cursor FOR Loops Using Subqueries


There is no need to declare the cursor.
Example:
BEGIN
FOR emp_record IN (SELECT employee_id, last_name
FROM employees WHERE department_id =30)
LOOP
DBMS_OUTPUT.PUT_LINE( emp_record.employee_id
||' '||emp_record.last_name);
END LOOP;
END;
/

7 - 19

Copyright 2007, Oracle. All rights reserved.

Cursors with Parameters


Syntax:
CURSOR cursor_name
[(parameter_name datatype, ...)]
IS
select_statement;

Pass parameter values to a cursor when the cursor is opened


and the query is executed.
Open an explicit cursor several times with a different active
set each time.

OPEN

7 - 20

cursor_name(parameter_value,.....) ;

Copyright 2007, Oracle. All rights reserved.

Cursors with Parameters

DECLARE
CURSOR
c_emp_cursor (deptno NUMBER) IS
SELECT employee_id, last_name
FROM
employees
WHERE
department_id = deptno;
...
BEGIN
OPEN c_emp_cursor (10);
...
CLOSE c_emp_cursor;
OPEN c_emp_cursor (20);
...

7 - 21

Copyright 2007, Oracle. All rights reserved.

FOR UPDATE Clause


Syntax:
SELECT ...
FROM
...
FOR UPDATE [OF column_reference][NOWAIT | WAIT n];

Use explicit locking to deny access to other sessions for the


duration of a transaction.
Lock the rows before the update or delete.

7 - 22

Copyright 2007, Oracle. All rights reserved.

WHERE CURRENT OF Clause


Syntax:
WHERE CURRENT OF cursor ;

Use cursors to update or delete the current row.


Include the FOR UPDATE clause in the cursor query to lock
the rows first.
Use the WHERE CURRENT OF clause to reference the current
row from an explicit cursor.
UPDATE employees
SET
salary = ...
WHERE CURRENT OF c_emp_cursor;

7 - 24

Copyright 2007, Oracle. All rights reserved.

Cursors with Subqueries


Example:
DECLARE
CURSOR my_cursor IS
SELECT t1.department_id, t1.department_name,
t2.staff
FROM
departments t1, (SELECT department_id,
COUNT(*) AS staff
FROM employees
GROUP BY department_id) t2
WHERE t1.department_id = t2.department_id
AND
t2.staff >= 3;
...

7 - 25

Copyright 2007, Oracle. All rights reserved.

Summary
In this lesson, you should have learned how to:
Distinguish cursor types:
Implicit cursors are used for all DML statements and singlerow queries.
Explicit cursors are used for queries of zero, one, or more
rows.

Create and handle explicit cursors


Use simple loops and cursor FOR loops to handle multiple
rows in the cursors
Evaluate the cursor status by using the cursor attributes
Use the FOR UPDATE and WHERE CURRENT OF clauses to
update or delete the current fetched row

7 - 26

Copyright 2007, Oracle. All rights reserved.

Practice 7: Overview
This practice covers the following topics:
Declaring and using explicit cursors to query rows of a table
Using a cursor FOR loop
Applying cursor attributes to test the cursor status
Declaring and using cursors with parameters
Using the FOR UPDATE and WHERE CURRENT OF clauses

7 - 27

Copyright 2007, Oracle. All rights reserved.

Você também pode gostar