Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >PLSQL-游标

PLSQL-游标

作者头像
字母哥博客
发布于 2020-09-23 03:17:51
发布于 2020-09-23 03:17:51
91800
代码可运行
举报
运行总次数:0
代码可运行

游标(Cursor):用来查询数据库,获取记录集合(结果集)的指针,可以让开发者一次访问一行结果集,在每条结果集上作操作。

  • 游标可分为: 1.静态游标:分为显式(explicit)游标和隐式(implicit)游标。 2.REF游标(动态游标):是一种引用类型,类似于指针。
  • 显式和隐式游标的区别: 尽量使用隐式游标,避免编写附加的游标控制代码(声明,打开,获取,关闭),也不需要声明变量来保存从游标中获取的数据。
  • REF游标和静态游标的区别 1)静态游标不能返回到客户端。ref游标能够被返回到客户端,是从Oracle的存储过程返回结果集的方式。 2)不能在包说明或包体中的过程或函数之外定义ref游标。只能在定义ref游标的过程中处理它,或返回到客户端应用程序。 3)ref游标可以从子例程传递到子例程,而游标则不能。 为了共享静态游标,必须在包说明或包体中把它定义为全局游标。 4)使用静态游标--通过静态SQL(但不用ref游标)--比使用ref游标效率高,

静态游标

显式游标

  • 显式游标的使用方法: 第一步:声明游标 第二步:打开游标 第三步:使用游标进行循环操作 第四步:关闭游标
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
create or replace procedure TEST is
  cursor c1(inname in varchar2) is
    select tname from tab where tname like inname;
  pname varchar2(32);
begin
  open c1('T%');
  loop
    fetch c1 into pname;
    exit when c1%notfound;
    dbms_output.put_line(pname);
  end loop;
  close c1;
end TEST;

DML隐式游标

  • 在PL/SQL中使用DML语言,使用ORACLE提供的名为“SQL”的隐示游标。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
declare
begin
  update departments set department_name = department_name;
  dbms_output.put_line('update ' || sql%rowcount || ' records');
end;

CURSOR FOR IN LOOP隐式游标

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//例子1:无参数,使用循环,无须打开关闭游标
create or replace procedure TEST is
  cursor c1 is select tname from tab;
begin
  for rr in c1 loop
    dbms_output.put_line(rr.tname);
  end loop;
end TEST;
//例子2:有参数,使用循环,无须打开关闭游标
create or replace procedure TEST is
    cursor c1(inname in varchar2) is select tname from tab where tname like inname;
begin
  for rr in c1('T%') loop
    dbms_output.put_line(rr.tname);
  end loop;
end TEST;

游标的常用属性

  • %FOUND:变量最后从游标中获取记录的时候,在结果集中找到了记录。
  • %NOTFOUND:变量最后从游标中获取记录的时候,在结果集中没有找到记录。
  • %ROWCOUNT:当前时刻已经从游标中获取的记录数量。
  • %ISOPEN:是否打开。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
declare  /* /* 定义静态游标 */ */
  Cursor emps is
    Select * from employees where rownum < 6 order by 1;
  emp employees%rowtype;
  row number := 1;
begin
  Open emps; /* ´打开静态游标 */
  fetch emps into emp; /*  读取游标当前行  */
  loop
    if emps%found then
      dbms_output.put_line('Looping over record ' || row || ' of ' || emps%rowcount);
      fetch emps into emp;
      row := row + 1;
    elsif emps%notfound then
      exit;
    end if;
  End loop;

  If emps%isopen then
    close emps; /*  关闭游标  */
  End if;
End;

游标的更新与删除

  • UPDATE或DELETE语句中的WHERE CURRENT OF子串专门处理要执行UPDATE或DELETE操作的表中取出的最近的数据。要使用这个方法,在声明游标时必须使用FOR UPDATE子串.
  • 当对话使用FOR UPDATE子串打开一个游标时,所有返回集中的数据行都将处于行级(ROW-LEVEL)独占式锁定,其他对象只能查询这些数据行,不能进行UPDATE、DELETE或SELECT...FOR UPDATE操作。
  • 在多表查询中,使用OF子句来锁定特定的表,如果忽略了OF子句,那么所有表中选择的数据行都将被锁定。如果这些数据行已经被其他会话锁定,那么正常情况下ORACLE将等待,直到数据行解锁。
  • 在UPDATE和DELETE中使用WHERE CURRENT OF子串的语法如下: WHERE{CURRENT OF cursor_name|search_condition}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
create or replace procedure pc_SetVersionValid(PFlowsID in integer) is
  Cursor c1 is
    select * from wf_flows
    where flowname in
           (select flowname from wf_flows where flowsid = PFlowsID)
    for update;

  r c1%rowtype;
  v integer;
begin
  open c1;
  fetch c1 into r;
  while c1%found loop
    if r.flowsid = PFlowsID then
      v := 1;
    else
      v := 0;
    end if;
    UPDATE wf_flows SET isValid = v WHERE CURRENT OF c1;
    fetch c1 into r;
  end loop;
  close c1;
  commit;
end;

引用游标ref cursor

弱类型引用游标,就是不指定游标将要提取的数据行的类型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
declare
       type my_cur_type is ref cursor;
       mycur my_cur_type;--声明引用游标变量

       which varchar2(10);
       deptrow dept%rowtype;
       emprow emp%rowtype;
begin

     which := '&请选择dept还是emp';
     if (which = 'dept') then
        open mycur for select * from dept;      --引用游标可以动态sql
        loop
            fetch mycur into deptrow;
            exit when (mycur%notfound);
            dbms_output.put_line(deptrow.deptno || '  ' || deptrow.dname);
        end loop;
     elsif (which = 'emp') then
        open mycur for select * from emp;       --引用游标可以动态sql
        loop
            fetch mycur into emprow;
            exit when (mycur%notfound);
            dbms_output.put_line(emprow.empno || '  ' || emprow.ename);
        end loop;

     end if;

     close mycur;
end;

强类型引用游标

  • 就是指定游标将要提取的数据行的类型 ,只能是record或%rowtype类型.比如:return number是错的,return emp.ename%type也是错的
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
declare
       type mycurtype is ref cursor return emp%rowtype;
       mycur mycurtype;--声明变量

       emprow emp%rowtype;
begin
        open mycur for select * from emp;
        loop
            fetch mycur into emprow;
            exit when mycur%notfound;
            dbms_output.put_line(emprow.empno || '  ' || emprow.ename);
        end loop;

        close mycur;
end;

喜欢 (9)or分享 (0)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-02-09),如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PL/SQL 编程(二)游标、存储过程、函数
游标--数据的缓存区 游标:类似集合,可以让用户像操作数组一样操作查询出来的数据集,实质上,它提供了一种从集合性质的结果中提取单条记录的手段。 可以将游标形象的看成一个变动的光标,他实质上是一个指针,在一段Oracle存放数据查询结果集或者数据操作结果集的内存中,这个指针可以指向结果集任何一条记录。 游标分静态游标和REF游标两类,静态游标包含显式游标和隐式游标。 显式游标: 在使用之前必须有明确的游标声明和定义,这样的游标定义会关联数据查询语句,通常会返回一行或多行。打开游标后,用户可以利用游标的位置对结
二十三年蝉
2018/02/28
4K0
PL/SQL --> 游标
映射在结果集中某一行数据的具体位置,类似于C语言中的指针。即通过游标方式定位到结果集中某个特定的行,然后根据业务需求
Leshami
2018/08/07
1.2K0
游标和动态SQL
游标类别:静态游标(指在编译的时候,游标就与一个select语句进行了静态绑定的游标,这种游标只能作用于一个查询语句)和动态游标(就是希望我们的查询语句在运行的时候才跟游标绑定,为了使用动态游标,必须声明游标变量)。
全栈程序员站长
2022/09/09
1.3K0
Oracle数据库学习笔记(七 —— 游标)
当执行一条DML语句或者SELECT…INTO语句时,都会创建一个隐含游标 隐含游标的名称是SQL,不能对SQL
Gorit
2021/12/09
1.2K0
PL/SQL 游标变量
    游标变量与游标相似,有其共性,也有其不同点。就其共性来说两者都是指向多行查询的结果集中的当前行。都要经历声明,打开,检索与关闭的过程。所不同的是游标与游标变量类似于常量与变量。游标是静态的,而游标变量是动态的,因为游标变量并不与某个特定的查询相绑定。所以,游标变量可以打开任何类型兼容的查询。其次可以将游标变量作为参数传递给本地和存储子程序。本文主要描述游标变量的使用。
Leshami
2018/08/14
1.5K0
Oracle中游标Cursor使用实例
Oracle数据库中的cursor分为2中类型:shared cursor,session cursor
星哥玩云
2022/08/17
1.2K0
Oracle11g全新讲解之游标
  一般是配合显示游标去使用的,不需要显示声明,打开,关闭,系统自定维护,名称为:sql
用户4919348
2023/05/27
5900
Oracle11g全新讲解之游标
Oracle-PL/SQL基础
pl/sql(procedural language/sql)是Oracle在标准的sql语言上的扩展,pl/sql不仅允许嵌入Sql语言,还可以定义变量和常量,允许使用条件语句和循环语句,允许使用例外处理各种错误,这样使得它的功能变得更加强大。
小小工匠
2021/08/16
2K0
ORACLE游标(oracle游标属性)
简单说,退出循环的必要条件:fetch 语句执行成功 + 第一次 fetch 的值返回 null
全栈程序员站长
2022/08/02
2K0
ORACLE游标(oracle游标属性)
PL/SQL学习笔记-游标
更多隐式游标属性请看此系列文章的附录: 常用函数 输出结果为受影响的行数 不能对隐式游标执行显示游标类似的操作,如: open  fetch close等 六:用for循环简化游标的操作
liulun
2022/05/09
2460
plsql编程语言_编程语言有哪些
–pl/sql编程语言 –pl/sql编程语言是对sql语言的扩展,是的sql语言具有过程化编程的特性 –pl/sql编程语言比一般的过程化编程语言,更加灵活高效 –pl/sql编程语言主要用来编写存储过程和存储函数等。
全栈程序员站长
2022/09/27
15.8K0
oracle游标的使用详解_oracle游标失效
游标(CURSOR):游标是把从数据表中提取出来的数据,以临时表的形式存放在内存中,在游标中有一个数据指针,在初始状态下指向的是首记录,利用fetch语句可以移动该指针,从而对游标中的数据进行各种操作。
全栈程序员站长
2022/11/18
2.3K0
oracle游标的使用详解_oracle游标失效
Oracle总结【PLSQL学习】
PLSQL介绍 PLSQL是Oracle对SQL99的一种扩展,基本每一种数据库都会对SQL进行扩展,Oracle对SQL的扩展就叫做PLSQL… SQL99是什么 (1)是操作所有关系型数据库的规则 (2)是第四代语言 (3)是一种结构化查询语言 (4)只需发出合法合理的命令,就有对应的结果显示 SQL的特点 (1)交互性强,非过程化 (2)数据库操纵能力强,只需发送命令,无需关注如何实现 (3)多表操作时,自动导航简单,例如: select emp.empno,emp.sal,dept.dname fr
Java3y
2018/03/15
2.7K0
Oracle总结【PLSQL学习】
Oracle数据库之第四篇
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
海仔
2019/10/22
1.1K0
PLSQ编程
LOOP 要执行的语句; EXIT WHEN <条件语句> /条件满足,退出循环语句/END LOOP;
全栈程序员站长
2022/07/05
1.9K0
快速学习Oracle-pl/sql 基本语法
PL/SQL(Procedure Language/SQL)PLSQL 是 Oracle 对 sql 语言的过程化扩展,指在 SQL 命令语言中增加了过程处理语句(如分支、循环等),使 SQL 语言具有过程处理能力。把 SQL 语言的数据操纵能力与过程语言的数据处理能力结合起来,使得 PLSQL 面向过程但比过程语言简单、高效、灵活和实用。
cwl_java
2019/12/19
1.3K0
Oracle游标使用详解
本节对Oracle中的游标进行详细讲解。本节所举实例来源Oracle中scott用户下的emp表dept表:
星哥玩云
2022/08/17
4.3K0
Oracle游标使用详解
Oracle PL/SQL入门语法点
PL_SQL:带有分支和循环,面向过程 匿名块: declare(可选,声明各种变量和游标的地方) begin(必要的,从此开始执行) exception(抓取到异常后执行的) end; [sql] view plaincopy set serveroutput on;(默认是关闭) --最简单的PL/SQL语句块 begin dbms_output.put_line('HelloWorld!'); end; --最简单的语句块 declare v_name varchar2(20); be
java干货
2021/02/19
5540
PL/SQL学习笔记_02_游标
        在 PL/SQL 程序中,对于处理多行记录的事务经常使用游标来实现。 
shirayner
2018/08/10
9910
Oracle-procedure/cursor解读
存储过程( Stored Procedure )是一组为了完成特定功能的 SQL 语句集,经编译后存储在数据库中。
小小工匠
2021/08/16
1K0
相关推荐
PL/SQL 编程(二)游标、存储过程、函数
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验