`

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讲解2(游标).pptx

    Oracle_PL_SQL讲解2(游标).pptx

    Oracle_T6_PLSQL与游标.sql

    OraclePL/SQL练习,基本的OraclePL/SQL的语法,游标的在PL/SQL中的使用,如何声明游标,打开游标,提取记录,关闭游标。

    oracle-plsql.zip_oracle_pl sql 分组查询_plsql_plsql 分组查询

    单行查询 分组查询 多表查询 子查询 高级查询 高级查询 数据字典 约束 视图 索引 游标 函数 存储过程 触发器 事务管理 用户管理 备份 恢复

    Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(一)

    Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(一) http://download.csdn.net/source/3268267 Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(二) ...

    Oracle10g_PL_SQL_编程讲义

    主要内容:PL/SQL 语言的基本特征、PL/SQL程序的结构、PL/SQL语言的控制结构、游标(cursor)编程、错误处理、存储过程和函数、创建包(Package)、触发器(Trigger)。

    Oracle_PLSQL语言基础

    PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE 服务器和其他工具中了,近几年中更多的开发人员和DBA开始使用PL/SQL,本文将讲述PL/SQL基础语法,结构和组件、以及如何设计并执行一个PL...

    Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(二)

     本书是专门为oracle应用开发人员提供的sql和pl/sql编程指南。通过学习本书,读者不仅可以掌握oracle常用工具oracle universal installer、net comfiguration assistant、sql developer、sql*plus的作用及使用方法...

    Oracle 11g SQL和PL SQL从入门到精通〖送源代码〗

    本书是专门为Oracle应用开发人员提供的SQL和PL/SQL编程指南。通过学习本书,读者不仅可以掌握Oracle常用工具Oracle Universal Installer、Net Comfiguration Assistant、SQL Developer、SQL*Plus的作用及使用方法,...

    Oracle PL/SQL语言初级教程

    Oracle PL/SQL语言初级教程 1 目录 1 1.PL/SQL语言基础 3 过程 5 包(package) 6 变量和常量 6 执行部分 10 控制结构 12 小结 17 2.PL/SQL的复合数据类型 17 使用记录 19 PL/SQL集合 23 嵌套表 24 使用集合 25 集合的...

    Oracle教案 Oracle 存储过程 游标 SQL语句 PL/SQL

    Oracle是一个生产中间件和数据库的较大的生产商,oracle原本的含义:“神谕”,指的是神说的话,中国在商朝时代,把一些刻在龟壳上的文字当成是上天的指示,所以在中国将oracle翻译成”甲骨文”.

    Oracle PL SQL

    走进Oracle、认识PL/SQL、数据表的基本操作、表中数据的基本操作、数据的基本查询、查询中函数的使用、数据表的高级查询、索引及视图的使用、数据类型、流程控制、游标、存储过程和函数、触发器、异常处理、事务和锁...

    整理:oracle pl/sql 入门+ 数组使用+游标+动态SQL

    NULL 博文链接:https://dolphin-ygj.iteye.com/blog/440204

    Oracle数据库SQL和PL/SQL实例教程

    Oracle数据库SQL和PL/SQL实例教程 非常适用于初学者。结合例子深刻形象的讲解。 第1章 关系数据库与SQL语言环境 第2章 数据查询 第3章 数据操作 第4章 表和视图 第5章 其他数据库对象 第6章 SQL基础 第7章 游标和...

    Oracle从基础到熟练(太实用了)

    ①:什么是PL/SQL ②:集合 ③:动态SQL ④:条件语句 ⑤:循环语句 ⑥:执行计划 八.游标 ①:隐式游标 ②:显式游标 ③:REF游标 ④:使用游标的好处和坏处 十.子程序[proc,udf],自主事务处理和程序包 ①:存储...

    Oracle 游标使用总结

    隐式游标(Implicit Cursor):是指非PL/SQL程序中定义的、而且是在PL/SQL中使用UPDATE/DELETE语句时,Oracle系统自动分配的游标。 一.显示游标 1.使用步骤 (1)定义 (2)打开 (3)使用 (4)关闭 2.使用演示 首先创建...

    Oracle 11g SQL和PL SQL从入门到精通.part1

     本书是专门为oracle应用开发人员提供的sql和pl/sql编程指南。通过学习本书,读者不仅可以掌握oracle常用工具oracle universal installer、net comfiguration assistant、sql developer、sql*plus的作用及使用方法...

    Oracle--biancheng.rar_oracle_oracle cursors _sage _存储过程

    设有学生表student(学号sno, 姓名sname, 年龄 sage,系别dept)、课程表Course(课程号cno,课程名称cname)和选课表sc(学号sno,课程号cno,成绩grade),用Oracle PL/SQL语言设计一个名为pkg_student程序包,要求: ...

    oracle PL_SQL 教程

    oracle 教程 是我的学习笔记。 关于 存储过程(procedure) , 函数(function) 游标(curser) , 任务(job) 等都有详细的说明了实例演示, 每个实例都是经过测试的。

Global site tag (gtag.js) - Google Analytics