• [bbk5153]第15集 Chapter 07Using Explicit cursors


    Objectives

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

    • Distinguish between implict and explicit cursors
    • Discuss the reasons for using explicti 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
    • USE BULK COLLECT to retriveve multiple rows of data with a single statement.

    Agenda

    • What are explicit cursors?
    • Using explicit cursors
    • Using cursors with parameters
    • Locking rows and referencing current row
    • Use BULK COLLECT to retrieve multiple rows of data with a single statement

    Cursors

    Every SQL statement that is 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

    Explicit Cursor Operations

    Controlling Explicit Cursors

    Declaring the Cursor

    • Syntax:
    CURSOR cursor_name IS
        SELECT statement;
    • Examples:
    Cursor without variables
    DECLARE
            CURSOR c_emp_cursor IS
            SELECT employee_id,last_name FROM employees
            WHERE department_id = 30;
    Cursor with variable
    DECLARE
            v_locid NUMBER := 1700;
    
            CURSOR c_dept_cursor
            IS
            SELECT * FROM dept
            WHERE location_id = v_locid;

    Opening the Cursor

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

    Fetching Data from the Cursor

    DECLARE
            --声明游标 c_emp_cursor
            CURSOR c_emp_cursor
            IS
                    SELECT employee_id,last_name
                    FROM employees
                    WHERE department_id = 30;
    
    
            --declare variables v_empno and v_lname
            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;
    /
    DECLARE
            --声明游标 c_emp_cursor
            CURSOR c_emp_cursor
            IS
                    SELECT employee_id,last_name
                    FROM employees
                    WHERE department_id = 30;
    
    
            --declare variables v_empno and v_lname
            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;
    
            CLOSE c_emp_cursor;
    END;
    /

    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_cursro;
    END;
    /

    Cursors and Records

    Process the rows of the active set by fetching values into a PL/SQL record.

    View Code
    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;
    /

    基于表锁定和基于游标锁定;

  • 相关阅读:
    Making your first driver
    注册表与盘符(转victor888文章 )
    电脑Win7如何取得文件管理所有权(提供各种GHOST版本的Windows)
    可拖动的DIV
    IE Javascript 进阶调试
    优化性能
    命令模式
    MVC 4 结合jquery.uploadify 上传实例
    IIS处理并发请求时出现的问题及解决
    Spring3.2 + Hibernate4.2
  • 原文地址:https://www.cnblogs.com/arcer/p/3029938.html
Copyright © 2020-2023  润新知