`

Oracle数据库之PLSQL游标

阅读更多
--=============cursor:在pl/sql中用来 处理多行多列(包括0行) 的记录数据=====================
-- Cursor: oracle使用专有的sql 工作区(private sql workparea)来执行sql语句,存储信息.这个工作区称之为cursor
--oracle每执行每一个sql语句都有唯一的cursor与之对应.

--2.游标的分类

----显示游标:即用户自定义游标,专门用于处理select语句返回的多行数据

----隐式游标:系统自动定义的游标,记录集只有单行数据,用于处理select into 和DML语句

--3.游标使用的一般过程:

----显式游标:声明(declare), 打开(open,执行sql语句,产生结果集), 读取(fetch,提取结果集中记录), 关闭(close)
------显示cursor的属性:
------属性                类型          描述
------%isopen          boolean      open--> true
------%notfound        boolean      前一个fetch没有返回一行记录-->true
------%found           boolean      前一个fetch返回一行记录-->true,同%notfound相反.
------%rowcount        number       到目前为止 cursor已提取的总行数

----隐式游标:直接使用读取,声明、打开、关闭都是系统自动进行的
------隐式cursor的属性:
------ 属性                类型                             描述
------SQL%isopen           boolean           dml执行为true,结束后false;
------SQL%notfound         boolean            sql%found属性返回值相反
------SQL%found            boolean           dml操作成功 true
------SQL%rowcount         number               dml执行成功的数据行数

--======显式游标============================================
---===============================================================================


declare
--声明游标: Cursor is  select xxx ; 在没有open之前 不会执行该select语句
        Cursor c_emp is
            select * from emp where deptno = 10 or deptno = 20;
        v_emp emp%rowtype; --声明变量,用来接收从cursor中的取出的每一条数据
begin
    open  c_emp; --打开cursor ,开始执行select 语句
       
        loop     --循环读取cursor结果
            fetch c_emp into v_emp; --从结果集中取数据到v_emp变量,并移动指向数据的指针
           
            if c_emp%FOUND  --如果上一个fetch找到记录 就返回true .
                then      dbms_output.put_line(v_emp.ename);
            else
                EXIT;
            end if;
        end loop;
   
    close c_emp; --关闭close,释放资源
end;

 
--2.record类型 + while处理cursor

declare
-- 定义record类型
    type r_emp_rec  is record(
        eid emp.empno%type,    name emp.ename%type
    );
   
    Cursor c_emp_cursor   is    
        select empno , ename  from emp where empno = 7900;
       
v_emp     r_emp_rec;--声明 v_emp 记录类型的变量 

begin
    open c_emp_cursor;
    --必须先fetch,c_emp_cursor%found的值才会是true或false,
-   --若不fetch, c_emp_cursor%found的值为null
    fetch c_emp_cursor into v_emp;
    --通过循环处理结果集中的数据,若c_emp_cursor%Found的值为false,循环结束
    while c_emp_cursor%FOUND     LOOP
         dbms_output.put_line(v_emp.name);
          fetch c_emp_cursor into v_emp; --再次fetch
    end loop;
    close c_emp_cursor;
end;       
/

 

-- 3 . record类型 + for处理cursor +游标参数
-- ----For循环对cursor的处理进行了集成,
------ 不需要open、循环处理fetch、close。cursor中的数据通过for循环中的记录类型的变量emp执行引用。

declare

--    type t_emp_rec is record(
--        salary emp.sal%type, name emp.ename%type
--    );
--    v_emp t_emp_rec;


    Cursor c_emp(emp_id number) is       -- emp_id是参数
        select sal , ename from emp where empno = emp_id;
begin
        for emp in c_emp(7900)  LOOP
                dbms_output.put_line(emp.ename);
        end LOOP;
end ;
/

 
--===========总结==============
--cursor的声明
----1.在游标声明中使用标准的select 语句
----2.查询中可以用order by来处理次序问题。
----3.可以在查询中引用变量,但必须在cursor语句之前声明这些变量.

Cursor c_emp_id(emp_id number) is
        select id from service where cost_id = emp_id;

 

--open cursor
----通过open cursor来执行select语句 并标识结果集.
----select语句没有记录返回 不会出现异常.
----open cursor emp_id(5);

--fech cursor.
----1.检查当前行 ,把值赋给变量.变量可以是record类型或者标量类型
----2. fetch  cursorName into 变量1,变量2 | record_name ;

--cursor结果集处理
----1.使用loop处理cursor.
----2.每次fetch一行,反复进行.
----3.使用%notfound属性检测一次不成功的提取操作
----4.使用显示cursor的属性检测提取是否成功,避免死循环.

--关闭cursor
----1.最后一条记录,应该关闭cursor.(有需要,可以再次open)
----2,cursor一旦关闭,所有和当前cursor相关的资源都会释放,不能从关闭的 cursor中fetch数据.
----3.对任何关闭的cursor的操作都会invalid_cursor错误。
----4.每个session打开的cursor数量由open_cursor参数决定   
       

--===========练习=================
-- 打印每个员工的ename , id ,不存在则打印not exists;

declare
    Cursor  c_emp  is
        --select * from emp where 1 = 2; -- 模拟没有查询到记录
        select  * from emp where 1 = 1;
    v_emp emp%rowtype;
begin
    open c_emp;
    fetch c_emp into v_emp;
   
    if c_emp%FOUND
        then
            while c_emp%FOUND LOOP
                dbms_output.put_line(v_emp.ename ||'--------------'|| v_emp.deptno);   
            fetch c_emp into v_emp;
            exit when c_emp%NOTFOUND;
            end loop;
    else
        dbms_output.put_line('not exists');   
    end if;
    close c_emp;
end;
/

 


 

 

分享到:
评论

相关推荐

    Oracle数据库实验-PLSQL游标、过程、函数、包的使用[文].pdf

    Oracle数据库实验-PLSQL游标、过程、函数、包的使用[文].pdf

    plsql游标、集合简单使用

    oracle数据库里plsql游标、集合及对象的简单使用,适合初学者查看

    ORACLE 数据库开发_PLSQL基础.doc

    大量源码案例,手把手教你PLSQL数据库开发。内容预览: ---- 第一章 PL/SQL 简介 ---- ---- 第二章 PL/SQL程序结构 ---- ---- 第三章 变量与数据类型 ---- ---- 第四章 PL/SQL控制语句 ---- ---- 第五章 PL/SQL游标 ...

    plsql基础(游标)

    相信讲述了游标以及它的一些应用实例,在while,if 和for循环下的代码编写。

    Oracle数据库SQL和PL SQL实例教程 高继民(ppt)

    oracle数据库ppt 第1章 关系数据库与SQL语言环境 第2章 数据查询 第3章 数据操作 第4章 表和视图 第5章 其他数据库对象 第6章 SQL基础 第7章 游标和异常处理 第8章 存储过程、函数和包 第9章 触发器 第10章 数据库...

    oracle数据库技术文档

    1、ORACLE 体系结构 2、sql_plus函数 3、sqlplus常用命令 4、sql 5、锁和表分区 6、数据库对象 7、oop 8、PLSQL 9、游标 10、程和函数 11、触发器 12、导入导出备份 13、如何正确利用rownum来限制查询所返回的行数 ...

    Oracle从入门到高级应用的全部课程文档

    这是我学习Oracle时,老师给的讲义,包含了Oracle从入门到高级应用的全部资料。 以下是文件列表 Day01-Oracle基础.pdf Day02-Oracle表的管理.pdf ...Day11-plsql游标和函数.pdf Day12-触发器.pdf Day13-索引.pdf

    Oracle PLSQL实例代码

    PLSQL数据库编程 存储过程 游标 等等

    oracle存储过程和函数PPT

    主要介绍Oracle数据库开发技术,包括存储过程、函数、游标及plsql的教程。

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

     第15章 使用游标  第16章 异常处理 . 第17章 本地动态sql  第18章 pl/sql过程  第19章 pl/sql函数  第20章 pl/sql包  第21章 触发器  第22章 使用对象类型 第四部分 pl/sql系统包  第23章 使用大对象  ...

    Oracle_PLSQL语言基础

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

    XML Oracle Servlet 复习汇总(S2)

    2 Oracle:plsql,游标 6分 3 Oracle:sql命令 8分 4 Oracle:数据库创建,授权 6分 5 Oracle:plsql块 5分 6 Oracle:过程与函数 6分 7 Oracle:plsql块 6分 8 Oracle:plsql,过程与函数 8分 9 Oracle:建表,组合索引 6分...

    Oracle数据库SQL和PL SQL实例教程PPT(推荐)

    第1章 关系数据库与SQL语言环境.ppt 第2章 数据查询.ppt 第3章 数据操作.ppt ...第6章 PLSQL基础.ppt 第7章 游标和异常处理.ppt 第8章 存储过程、函数和包.ppt 第9章 触发器.ppt 第10章 数据库开发应用实例.ppt

    oracle教程PLSQL

    oracle教程 里面包含全部的从基础到游标 存储过程 触发器 包 函数的详细的代码,涉及面很全,可以通过修改其实例代码,达到你所需要的效果,里面详细的介绍基础的SQL以后后面比较复杂的PLSQL

    Oracle PLSQL编程-经典试题

    里面有orcale plsql经典试题,视图,存储过程,游标,包,异常处理。

    oracle PL/SQL测试题目和详细答案

    pl/sql存储过程,函数,游标,以及存储过程中的基础知识,绝对值得你收藏的经典题目,让你的pl/sql得到最大的锻炼。让你的数据库逻辑更加灵活。

    嘉兴IBM培训Oracle课件

    嘉兴IBM培训Oracle课件 ...ORACLE04数据库对象 ORACLE05PLSQL编程基础 ORACLE06游标 ORACLE07记录类型与PLSQL表 ORACLE08过程与函数 ORACLE09触发器 ORACLE10包 ORACLE11对象类型 ORACLE12可变数组和嵌套表

    Oracle 从入门到精通视频教程(11G版本)(ppt)

    第1章-Oracle 11g数据库简介 认识Oracle 11g 回忆Oracle的产品版本 学习Oracle 11g的新特性 第2章-Oracle 11g的安装与测试 能够使用Oracle 11g的基本条件 在Windows 2003上安装Oracle 11g 移除Oracle 11g ...

    PLSQLDeveloper下载

    PL/SQL Developer是一个集成开发环境,专门面向Oracle数据库存储程序单元的开发。如今,有越来越多的商业逻辑和应用逻辑转向了Oracle Server,因此,PL/SQL编程也成了整个开发过程的一个重要组成部分。PL/SQL ...

    plsql_oracle 编程

    第一章 PL/SQL 程序设计简介 4 §1.2 SQL与PL/SQL 4 §1.2.1 什么是PL/SQL? 4 §1.2.1 PL/SQL的好处 4 §1.2.2 PL/SQL 可用的SQL语句 5 §1.3 运行PL/SQL程序 5 ...§8.5 数据库触发器的应用举例 13

Global site tag (gtag.js) - Google Analytics