After completing this lesson, you should be able to do the following: Distinguish between an implicit and an explicit cursor use a PL / SQL record variable Write a cursor for loop 6-3 Copyright (c) Oracle Corporation, 2001. All rights reserved. Every SQL statement executed by the Oracle Server has an individual cursor associated with it.
After completing this lesson, you should be able to do the following: Distinguish between an implicit and an explicit cursor use a PL / SQL record variable Write a cursor for loop 6-3 Copyright (c) Oracle Corporation, 2001. All rights reserved. Every SQL statement executed by the Oracle Server has an individual cursor associated with it.
After completing this lesson, you should be able to do the following: Distinguish between an implicit and an explicit cursor use a PL / SQL record variable Write a cursor for loop 6-3 Copyright (c) Oracle Corporation, 2001. All rights reserved. Every SQL statement executed by the Oracle Server has an individual cursor associated with it.
After completing this lesson, you should be able to do the following: Distinguish between an implicit and an explicit cursor use a PL / SQL record variable Write a cursor for loop 6-3 Copyright (c) Oracle Corporation, 2001. All rights reserved. Every SQL statement executed by the Oracle Server has an individual cursor associated with it.
Download as PPT, PDF, TXT or read online from Scribd
Download as ppt, pdf, or txt
You are on page 1of 25
Copyright Oracle Corporation, 2001. All rights reserved.
Writing Explicit Cursors
6-2 Copyright Oracle Corporation, 2001. All rights reserved. Objectives After completing this lesson, you should be able to do the following: Distinguish between an implicit and an explicit cursor Discuss when and why to use an explicit cursor Use a PL/SQL record variable Write a cursor FOR loop 6-3 Copyright Oracle Corporation, 2001. All rights reserved. About Cursors Every SQL statement executed by the Oracle Server has an individual cursor associated with it: Implicit cursors: Declared for all DML and PL/SQL SELECT statements Explicit cursors: Declared and named by the programmer 6-4 Copyright Oracle Corporation, 2001. All rights reserved. Explicit Cursor Functions 6-5 Copyright Oracle Corporation, 2001. All rights reserved. Controlling Explicit Cursors 6-6 Copyright Oracle Corporation, 2001. All rights reserved. Controlling Explicit Cursors 1. Open the cursor 2. Fetch a row 3. Close the Cursor 6-7 Copyright Oracle Corporation, 2001. All rights reserved. Controlling Explicit Cursors 1. Open the cursor 2. Fetch a row 3. Close the Cursor 6-8 Copyright Oracle Corporation, 2001. All rights reserved. Controlling Explicit Cursors 1. Open the cursor 2. Fetch a row 3. Close the Cursor 6-9 Copyright Oracle Corporation, 2001. All rights reserved.
Declaring the Cursor Do not include the INTO clause in the cursor declaration. If processing rows in a specific sequence is required, use the ORDER BY clause in the query. CURSOR cursor_name IS select_statement; Syntax: 6-10 Copyright Oracle Corporation, 2001. All rights reserved.
Declaring the Cursor DECLARE CURSOR emp_cursor IS SELECT employee_id, last_name FROM employees; CURSOR dept_cursor IS SELECT * FROM departments WHERE location_id = 170; BEGIN ... Example: 6-11 Copyright Oracle Corporation, 2001. All rights reserved.
Opening the Cursor Syntax: OPEN cursor_name; Open the cursor to execute the query and identify the active set. If the query returns no rows, no exception is raised. Use cursor attributes to test the outcome after a fetch. 6-12 Copyright Oracle Corporation, 2001. All rights reserved.
Fetching Data from the Cursor Syntax: FETCH cursor_name INTO [variable1, variable2, ...] | record_name]; Retrieve the current row values into variables. Include the same number of variables. Match each variable to correspond to the columns positionally. Test to see whether the cursor contains rows. 6-13 Copyright Oracle Corporation, 2001. All rights reserved.
Fetching Data from the Cursor Example: LOOP FETCH emp_cursor INTO v_empno,v_ename; EXIT WHEN ...; ... -- Process the retrieved data
END LOOP; 6-14 Copyright Oracle Corporation, 2001. All rights reserved. Closing the Cursor
Syntax: CLOSE cursor_name; Close the cursor after completing the processing of the rows. Reopen the cursor, if required. Do not attempt to fetch data from a cursor after it has been closed. 6-15 Copyright Oracle Corporation, 2001. All rights reserved. Explicit Cursor Attributes Obtain status information about a cursor. 6-16 Copyright Oracle Corporation, 2001. All rights reserved. The %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 emp_cursor%ISOPEN THEN OPEN emp_cursor; END IF; LOOP FETCH emp_cursor ... 6-17 Copyright Oracle Corporation, 2001. All rights reserved. Controlling Multiple Fetches Process several rows from an explicit cursor using a loop. Fetch a row with each iteration. Use explicit cursor attributes to test the success of each fetch. 6-18 Copyright Oracle Corporation, 2001. All rights reserved. The %NOTFOUND and %ROWCOUNT Attributes Use the %ROWCOUNT cursor attribute to retrieve an exact number of rows. Use the %NOTFOUND cursor attribute to determine when to exit the loop. 6-19 Copyright Oracle Corporation, 2001. All rights reserved. Example
SET SERVEROUTPUT ON DECLARE v_empno employees.employee_id%TYPE; v_ename employees.last_name%TYPE; CURSOR emp_cursor IS SELECT employee_id, last_name FROM employees; BEGIN OPEN emp_cursor; LOOP FETCH emp_cursor INTO v_empno, v_ename; EXIT WHEN emp_cursor%ROWCOUNT > 10 OR emp_cursor%NOTFOUND; DBMS_OUTPUT.PUT_LINE (TO_CHAR(v_empno) ||' '|| v_ename); END LOOP; CLOSE emp_cursor; END ; 6-20 Copyright Oracle Corporation, 2001. All rights reserved. Cursors and Records
CREATE TABLE temp_list AS SELECT employee_id, last_name FROM employees WHERE employee_id = 50; DECLARE CURSOR emp_cursor IS SELECT employee_id, last_name FROM employees; emp_record emp_cursor%ROWTYPE; BEGIN OPEN emp_cursor; LOOP FETCH emp_cursor INTO emp_record; EXIT WHEN emp_cursor%NOTFOUND; INSERT INTO temp_list (empid, empname) VALUES (emp_record.employee_id, emp_record.last_name); END LOOP; COMMIT; CLOSE emp_cursor; END; Process the rows of the active set by fetching values into a PL/SQL RECORD. 6-21 Copyright Oracle Corporation, 2001. All rights reserved. Cursor FOR Loops
FOR record_name IN cursor_name LOOP statement1; statement2; . . . END LOOP; Syntax: The cursor FOR loop is a shortcut to process explicit cursors. Implicit open, fetch, exit, and close occur. The record is implicitly declared. 6-22 Copyright Oracle Corporation, 2001. All rights reserved. Cursor FOR Loops
SET SERVEROUTPUT ON DECLARE CURSOR emp_cursor IS SELECT last_name, department_id FROM employees; BEGIN FOR emp_record IN emp_cursor LOOP --implicit open and implicit fetch occur IF emp_record.department_id = 80 THEN DBMS_OUTPUT.PUT_LINE (Employee || emp_record.last_name || works in the Sales Dept. ); END IF; END LOOP; --implicit close and implicit loop exit END ; Print a list of the employees who work for the sales department. 6-23 Copyright Oracle Corporation, 2001. All rights reserved. Cursor FOR Loops Using Subqueries
SET SERVEROUTPUT ON BEGIN FOR emp_record IN (SELECT last_name, department_id FROM employees) LOOP --implicit open and implicit fetch occur IF emp_record.department_id = 80 THEN DBMS_OUTPUT.PUT_LINE (Employee || emp_record.last_name || works in the Sales Dept. ); END IF; END LOOP; --implicit close occurs END ; No need to declare the cursor. Example: 6-24 Copyright Oracle Corporation, 2001. All rights reserved. Summary In this lesson you should have learned to: Distinguish cursor types: Implicit cursors: used for all DML statements and single-row queries Explicit cursors: used for queries of zero, one, or more rows Manipulate explicit cursors Evaluate the cursor status by using cursor attributes Use cursor FOR loops 6-25 Copyright Oracle Corporation, 2001. All rights reserved. Practice 6 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