`

Oracle_PL_ SQL_ 教程:游标

阅读更多
--######################################--
--游标
--王林 2012.07.06
--######################################--

/*
游标的作用就是用于临时存储从数据库中提取的数据块。在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或最终写回数据库。这样数据处理的速度才会提高,否则频繁的磁盘数据交换会降低效率。 
游标有两种类型:显式游标和隐式游标。在前述程序中用到的SELECT...INTO...查询语句,一次只能从数据库中提取一行数据,对于这种形式的查询和DML操作,系统都会使用一个隐式游标。但是如果要提取多行数据,就要由程序员定义一个显式游标,并通过与游标有关的语句进行处理。显式游标对应一个返回结果为多行多列的SELECT语句。 
游标一旦打开,数据就从数据库中传送到游标变量中,然后应用程序再从游标变量中分解出需要的数据,并进行处理。
对游标的操作包含四个部分:定义、打开、读取、关闭。
*/

--######################################--
--准备练习用表
CREATE TABLE wl_emp
AS
SELECT * FROM scott.emp;
--
SELECT * FROM wl_emp;

--######################################--
--一般游标
CREATE OR REPLACE PROCEDURE promotion_review_1
IS
    nemployeeid NUMBER;
    dstartdate  DATE;
    denddate    DATE;
    sjobid      VARCHAR2 (20);
       
    CURSOR cselectjob
    IS
        SELECT a.empno 
             , a.hiredate 
             , a.hiredate 
             , a.job
         FROM wl_emp a;
BEGIN
    OPEN cselectjob;
    LOOP
        FETCH cselectjob INTO nemployeeid
                            , dstartdate
                            , denddate
                            , sjobid ;
        EXIT WHEN cselectjob%NOTFOUND;
        DBMS_OUTPUT.put_line( 'Employee '
                              || nemployeeid
                              || ' has job '
                              || sjobid
                              || ' for '
                              || (denddate - dstartdate)
                              || ' days.'
                             );
    END LOOP;
    CLOSE cselectjob;
END;

--######################################--
--FOR游标
CREATE OR REPLACE PROCEDURE promotion_review_2
IS
    CURSOR cselectjob
    IS
        SELECT a.empno
             , a.hiredate dstartdate
             , a.hiredate denddate
             , a.job
          FROM wl_emp a;
BEGIN
    FOR jh_rec IN cselectjob LOOP
        DBMS_OUTPUT.put_line( 'Employee '
                              || jh_rec.empno
                              || ' had job '
                              || jh_rec.job
                              || ' for '
                              || (jh_rec.dstartdate - jh_rec.denddate)
                              || ' days.'
                            );
    END LOOP;
END;

--######################################--
--隐式游标
/*
隐式游标的%ISOPEN属性始终为FALSE,因为没有打开显示游标。为了访问隐式游标的属性可以使用SQL%attribute引用最近执行的隐式游标。
任何执行块或异常块中的DML语句都是隐式游标。它包括INSERT、UPDATE和DELETE语句。
在组合使用SELECT语句与INTO或BULK COLLECT INTO语句,或是在游标FOR循环语句中潜入SELECT语句时,也可以创建隐式游标。
PL/SQL块中的每条SQL语句实际上都是隐式游标。通过DML主句后使用%ROWCOUNT特性,可知道任何语句所改变的行数。
也可以对SELECT语句查询返回的行数。
*/
CREATE OR REPLACE PROCEDURE promotion_review_3
IS
    nempno NUMBER;
    CURSOR cselectjob
    IS
        SELECT a.empno
             , a.hiredate dstartdate
             , (a.hiredate + 1) denddate
             , a.job
          FROM wl_emp a;
BEGIN
    SELECT COUNT(*) 
      INTO nempno
      FROM wl_emp;
    
    DBMS_OUTPUT.put_line( 'There are ' 
                          || nempno
                          || ' employee history records.'
                         );
    FOR jh_rec IN cselectjob LOOP
        DBMS_OUTPUT.put_line( 'Employee '
                              || jh_rec.empno
                              || ' had job '
                              || jh_rec.job
                              || ' for '
                              || (jh_rec.denddate - jh_rec.dstartdate)
                              || ' days.'
                            );
    END LOOP;
END;

--######################################--
--REF游标
--动态显式游标
CREATE OR REPLACE PROCEDURE demo
IS 
    --局部变量的名称不能和列名相同,否则列名值会被替换而不是变量值。
    n_low_no  NUMBER := 7369;
    n_high_no NUMBER := 7654;
    emp_rec   VARCHAR2(20);    
    CURSOR c_selt_name
    IS
        SELECT a.ename
          FROM scott.emp a
         WHERE a.empno BETWEEN n_low_no AND n_high_no;
BEGIN
    OPEN c_selt_name;
    LOOP 
        FETCH c_selt_name INTO emp_rec;
        EXIT WHEN c_selt_name%NOTFOUND;
        DBMS_OUTPUT.put_line(emp_rec);
    END LOOP;
END demo;

--使用输入参数
CREATE OR REPLACE PROCEDURE demo
IS  
    n_low_no  NUMBER;
    n_high_no NUMBER;
    emp_rec   VARCHAR2(20);    
    CURSOR c_selt_name
    IS
        SELECT a.ename
          FROM scott.emp a
         WHERE a.empno BETWEEN n_low_no AND n_high_no;
BEGIN
    --将程序改变为使用输入参数。
    n_low_no  := TO_NUMBER(NVL(&1,7364));
    n_high_no := TO_NUMBER(NVL(&2,7655));
    OPEN c_selt_name;
    LOOP 
        FETCH c_selt_name INTO emp_rec;
        EXIT WHEN c_selt_name%NOTFOUND;
        DBMS_OUTPUT.put_line(emp_rec);
    END LOOP;
END demo;

--使用形式参数
CREATE OR REPLACE PROCEDURE demo
IS 
    n_low_no  NUMBER;
    n_high_no NUMBER;
    emp_rec   VARCHAR2(20); 
    --游标中的这些变量没有物理大小,因为他们在运行时获得。   
    CURSOR c_selt_name(low_id  NUMBER 
                     , high_id NUMBER)
    IS
        --SELECT语句中的变量不再是局部变量,他们是游标的局部变量,由游标定义中的形式参数定义。
        SELECT a.ename
          FROM scott.emp a
         WHERE a.empno BETWEEN low_id AND high_id;
BEGIN
    --在程序运行的时候,输入&1和&2分别赋值给局部变量n_low_no和n_high_no。
    n_low_no  := TO_NUMBER(NVL(&1,7364));
    n_high_no := TO_NUMBER(NVL(&2,7655));
    --局部变量成为打开游标时传递的实参,然后将实参赋给游标作用域的变量low_id和high_id。
    OPEN c_selt_name (n_low_no , n_high_no);
    LOOP 
        FETCH c_selt_name INTO emp_rec;
        EXIT WHEN c_selt_name%NOTFOUND;
        DBMS_OUTPUT.put_line(emp_rec);
    END LOOP;
END demo;

 

分享到:
评论

相关推荐

    Oracle_PL-SQL.rar_ORACLE PL_oracle_oracle sql_oracle 教程_pl sql

    这个“Oracle PL-SQL.rar”压缩包提供了针对初学者的Oracle PL/SQL语言教程,包含丰富的源代码示例和详细的解说,旨在帮助学习者快速掌握这一技能。 PL/SQL全称为Procedural Language/Structured Query Language,...

    SQL(oracle).rar_oracle_oracle sql_oracle 总结_pl sql_sql

    `pl_sql`标签表明,这份资料可能包含了关于PL/SQL的基础和高级概念,比如块结构(DECLARE, BEGIN, END)、异常处理(TRY-CATCH)、游标处理、动态SQL以及如何调用Oracle数据库的内置函数和包。 `oracle_总结`标签...

    Oracle_PLSQL.rar_Java plsql_oracle_oracle doc_pl sql_plsql

    在Oracle数据库环境中,PL/SQL被广泛用于开发存储过程、函数、触发器、游标和包,以实现复杂的业务逻辑和数据处理任务。本文将深入探讨Oracle PL/SQL的相关知识点,并结合Java进行集成开发。 1. **PL/SQL基础** - ...

    Oracle2BPL-SQL.rar_oracle_pl/sql

    Oracle2BPL-SQL.rar_oracle_pl/sql这个压缩包文件可能包含了关于Oracle PL/SQL的基础教程资料,其中的Oracle2BPL-SQL.pdf可能是详细的讲解文本。 Oracle PL/SQL由三部分组成:Procedural Language(过程语言)、...

    Oracle_PL_SQL讲解2(游标).pptx

    Oracle_PL_SQL讲解2(游标).pptx

    OraclePL-SQL.rar_ORACLE PL_oracle_oracle sql

    Oracle PL/SQL是Oracle数据库系统中的重要组成部分,用于开发存储过程、函数、触发器等数据库对象,以及执行复杂的SQL操作。以下是对Oracle PL/SQL及其相关知识点的详细说明: 1. **Oracle数据库基础**:Oracle...

    oracle_oracle_oraclepl/sql_

    Oracle PL/SQL是一种强大的编程语言,它结合了SQL(结构化查询语言)的数据库操作能力和过程性编程语言的控制结构。在"Oracle PL/SQL"这本书中,作者深入浅出地探讨了这一语言的核心概念和实用技巧,尤其适合法语...

    PLSQL.zip_oracl_oracle pl/sql ppt_pl sql ppt tutorial_pl/sql_pls

    "PLSQL.zip_oracl_oracle pl/sql ppt_pl sql ppt tutorial_pl/sql plsql.ppt"这个压缩包提供了学习PL/SQL的基础材料,通过"第一章 pl-sql介绍.ppt"开始你的学习之旅,逐步探索这个强大而灵活的数据库编程语言。

    PLSQL.rar_oracle_pl sql_plsql_plsql java_sql

    标题中的“PLSQL.rar_oracle_pl sql_plsql_plsql_java_sql”暗示了这是一个关于Oracle数据库中PLSQL使用的资源包,可能包含了PLSQL的教程、示例代码和与Java集成的相关信息。Oracle数据库是世界上最广泛使用的数据库...

    Oracle_Database_11g_SQL_-_Master_SQL_and_PLSQL_in_the_Oracle_Database

    这个压缩包文件"Oracle_Database_11g_SQL_-_Master_SQL_and_PLSQL_in_the_Oracle_Database"似乎包含了一本关于掌握Oracle 11g SQL和PL/SQL的教程资料。 SQL(结构化查询语言)是用于管理和操作数据库的标准语言,而...

    ORACLE8 PLSQL程序设计_sql_code.zip_oracle pl/sql_pl sql code_pl/sql_

    Oracle PL/SQL是一种强大的编程语言,它将关系数据库的强大功能与高级编程语法相结合,用于在Oracle数据库环境中构建复杂的业务逻辑和应用程序。Oracle8是PL/SQL的一个早期版本,尽管现在可能已经更新到了更高版本,...

    ORACLE_PL_SQL实战精讲

    《ORACLE_PL_SQL实战精讲》是一本专为PL/SQL开发者设计的指南,它深入浅出地介绍了Oracle数据库中的编程语言PL/SQL。PL/SQL是Oracle数据库系统中的核心组件,用于创建复杂的业务逻辑和数据处理程序。本书旨在帮助...

    pl_sql基本语法例子.rar_SQL2569_oracle_pl/sql_plsql增删改查

    5. PL/SQL中的游标: 游标用于遍历查询结果集,逐行处理数据。定义游标后,可以使用FETCH语句获取当前行数据,并通过%ROWTYPE属性创建变量存储这些数据。例如: ``` DECLARE cursor_name CURSOR FOR SELECT * ...

    oracle10g_pl/sql

    Oracle 10g PL/SQL 是Oracle数据库系统中用于创建和管理存储过程、函数、触发器等数据库对象的编程语言。本教程旨在为初学者提供一个全面的学习平台,同时也为经验丰富的开发者提供参考资料。PL/SQL是Oracle特有的...

    精通Oracle_10g_Pl_SQL编程(上下册)

    《精通Oracle_10g_PL/SQL编程》是一套针对Oracle数据库系统中PL/SQL编程语言的深度学习教程,分为上下两册。这套书籍旨在帮助读者从基础到高级全面掌握Oracle 10g版本的PL/SQL编程技术,无论你是初学者还是有经验的...

    PL-SQL.rar_pl_pl/sql

    PL/SQL是Oracle数据库系统中的编程语言,它是SQL(结构化查询语言)的扩展,用于在Oracle环境中编写存储过程、函数、触发器等数据库对象。这个"PL-SQL.rar_pl_pl/sql"压缩包可能包含了一个适合初学者学习PL/SQL的...

    Oracle_PL-SQL入门教程

    Oracle PL/SQL 入门教程是针对初学者的教程,主要涵盖了如何使用PL/SQL这一Oracle数据库的编程语言。PL/SQL是Oracle数据库系统中的一种结构化查询语言,它结合了SQL的功能并增加了过程性编程元素,使得开发者能够...

    Oracle_PL/SQL编程

    Oracle PL/SQL编程是Oracle数据库系统中的一个核心组成部分,它扩展了SQL的语法,使得数据库管理及应用程序开发更具灵活性和可编程性。PL/SQL融合了SQL查询和控制流语句,提供了处理复杂业务逻辑的能力。 PL/SQL的...

    Oracle_PLSQL游标的学习

    Oracle PL/SQL 游标的学习 游标是 Oracle PL/SQL 中的一个重要概念,它允许用户访问和操作结果集中的数据。游标可以理解为是一个映射在结果集中的一行数据上的位置实体,有了游标,用户就可以访问结果集中的任意一...

Global site tag (gtag.js) - Google Analytics