游标

说明

查询结果的光标,相当于java中的一个迭代器,方便遍历操作

可使用的属性

  • %FOUND

    SQL语句查询或影响了一行或多行时为 TRUE。如:mycursor%FOUND
  • %NOTFOUND

    SQL语句没有影响任何行时为 TRUE。如:mycursor%NOTFOUND
  • %ROWCOUNT

    SQL语句查询或影响的行数。如:mycursor%ROWCOUNT
  • %ISOPEN

    检查游标是否打开,隐式游标始终为FALSE。如:mycursor%ISOPEN

隐式游标

自动声明,自动打开,自动关闭,名称为SQL

只能处理单行数据

declare
emp_t employee%rowtype;
begin
select * into emp_t from employee where empno = 7859;
if SQL%found then
dbms_output.putline()
end if;
end;
/

显式游标

遍历输出

cursor 游标名称[(参数列表)] IS select_statement;

--使用游标遍历查询结果并输出
declare
--给查询结果建立一个游标
cursor cv_emp is select * from employee;
v_emp employee%rowtype;
begin
--使用for循环,游标会自动打开,移动和关闭
for v_emp in cv_emp loop
--这里只输出了员工编号和员工姓名
dbms_output.put_line(v_emp.empno||','||v_emp.ename);
end loop;
end;
/

游标使用

  1. 声明游标: cursor 游标名称[(参数列表)] IS select_statement;
  2. 打开游标: open 游标名称[(参数列表)];
  3. 从游标中提取数据(移动游标)到变量: FETCH 游标名称 INTO 变量列表....;
  4. 关闭游标: close 游标名称;

游标开始的时候是处于第一行之前,需要移动

--loop循环使用显示游标
--输出全部员工的信息
declare
cursor cv_emp
is select empno,ename,job,sal,hiredate from employee;
--声明一个可存储游标行的变量
rec_emp cv_emp%rowtype;
i number := 1;
begin
open cv_emp;
loop
--会使游标向下移动,并将游标所指向的数提取到指定的变量中
fetch cv_emp into rec_emp;
exit when cv_emp%notfound;--找不到数据就退出循环
dbms_output.put_line(i||'. '||rec_emp.empno||', '
||rec_emp.ename||', '
||rec_emp.job||','
||rec_emp.sal||','
||rec_emp.hiredate);
i := i+1;
end loop;
close cv_emp;--关闭游标
end;
/ --使用while循环
declare
--1. 声明游标
cursor cv_emp
is select empno,ename,job,sal,hiredate from employee; rec_emp cv_emp%rowtype;
i number := 1;
begin
open cv_emp;--2.打开游标
fetch cv_emp into rec_emp;--进入循环前就得移动游标
while cv_emp%found loop
dbms_output.put_line(i||'. '||rec_emp.empno||', '
||rec_emp.ename||', '
||rec_emp.job||','
||rec_emp.sal||','
||rec_emp.hiredate);
fetch cv_emp into rec_emp;
i := i+1;
end loop;
close cv_emp;--关闭游标
end;
/

带参数游标使用

--对所有的"销售员"(SALESMAN)增加佣金500.
declare
cursor cv_emp(v_job employee.job%type) is select * from employee where job = v_job;
v_emp employee%rowtype;
begin
for v_emp in cv_emp('SALESMAN') loop
--使用主键约束,更新特定行
update employee set sal = sal +500 where empno = v_emp.empno;
end loop;
commit;
end;
/

游标更新数据

一般更新操作,需要一个条件,来指定需要更新的该条数据,一般使用主键来指定。

如果不想使用主键来指定,还可以使用游标当作指定条件,这就是游标更新行

--对所有的"销售员"(SALESMAN)增加佣金500.

--普通方式更新数据
declare
cursor cv_emp(v_job employee.job%type) is select * from employee where job = v_job;
v_emp employee%rowtype;
begin
for v_emp in cv_emp('SALESMAN') loop
--使用主键约束,更新特定行
update employee set sal = sal +500 where empno = v_emp.empno;
end loop;
commit;
end;
/ --使用游标更新数据
declare
cursor cv_emp(v_job employee.job%type) is select * from employee where job = v_job for update;
v_emp employee%rowtype;
begin
open cv_emp('SALESMAN');
loop
fetch cv_emp into v_emp;
--使用游标定位特定行
update employee set sal = sal +500 where current of cv_emp;
end if;
exit when ev_emp%notfound;
end loop;
commit;
close cv_emp;
end;
/

REF游标

引用游标,动态游标

动态游标

oracle学习笔记(十八) PL/SQL 游标的更多相关文章

  1. Oracle学习笔记十 使用PL/SQL

    PL/SQL 简介 PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言,是对 SQL 的扩展,它支持多种数据类型,如大对象和集合类型,可使用 ...

  2. oracle学习笔记4:PL/SQL

    PL/SQL是没命名的存储过程,函数,触发器,PL/SQL块的语法格式如下: [declare] --声明部分,可选 begin --执行部分,必须 [exception] --异常处理部分,可选 e ...

  3. Oracle 学习笔记 17 -- 异常处理(PL/SQL)

    程序异常是在操作期间正常,出现在节目的准备过程是不可避免的例外.但是,必须有一个相应的异常处理机 制,以保证程序的正常运行.PL/SQL程序运行过程中出现的错误.称为异常. 一个优秀的程序都应该可以正 ...

  4. python3.4学习笔记(十八) pycharm 安装使用、注册码、显示行号和字体大小等常用设置

    python3.4学习笔记(十八) pycharm 安装使用.注册码.显示行号和字体大小等常用设置Download JetBrains Python IDE :: PyCharmhttp://www. ...

  5. Oracle学习笔记十二 子程序(存储过程、自定函数)和程序包

    子程序 子程序:命名的 PL/SQL 块,编译并存储在数据库中.   子程序的各个部分: 1.声明部分 2.可执行部分 3.异常处理部分(可选) 子程序的分类: 1.过程 - 执行某些操作 2.函数 ...

  6. Oracle学习笔记(十二)

    十三.存储过程和存储函数1.掌握存储过程(相当于建立一个函数或者方法体,然后通过外部对其调用) 指存储在数据库中供所有程序调用的子程序叫做存储过程或存储函数. 相同点: 完成特定功能的程序 区别: 是 ...

  7. oracle学习(二)pl/sql基础

    pl/sql组成:DDL DML DCL pl/sql特点: SQL&PL/SQL编译器集成PL/SQL,支持SQL所有范围的语法 支持CASE语句和表达式 继承和动态方法释放 类型进化.属性 ...

  8. Oracle学习笔记十四 内置程序包

    扩展数据库的功能 为 PL/SQL 提供对 SQL 功能的访问 用户 SYS 拥有所有程序包 是公有同义词 可以由任何用户访问 一些内置程序包 程序包名称 说明 STANDARD和DBMS_STAND ...

  9. (C/C++学习笔记) 十八. 继承和多态

    十八. 继承和多态 ● 继承的概念 继承(inheritance): 以旧类为基础创建新类, 新类包含了旧类的数据成员和成员函数(除了构造函数和析构函数), 并且可以派生类中定义新成员. 形式: cl ...

  10. oracle 学习(五)pl/sql语言存储过程&包

    首先搞清楚俩概念 存储过程(procedure)&程序包(package) 存储过程:数据库对象之一,可以理解为数据库的子程序,在客户端和服务器端可以直接调用它.触发器是与表直接关联的特殊存储 ...

随机推荐

  1. RTX5的汽车级,工业级,医疗和铁路安全认证已经通过,证书已颁发

    说明: 1.当前RTX5的教程已经在制作中,使用CMSIS-RTOS V2封装层,含FreeRTOS,配套V7,V6和V5板子​. 2.我们各种开发板和模块的资料汇总贴,搞了个cnblogs,临时先用 ...

  2. 解决python安装第三方库超时问题

    这里说明一下,配置文件中的url还可以换成下面的URL 阿里云 http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.u ...

  3. 使用matplotlib.pyplot中scatter()绘制散点图

    1.二维散点图 二维散点图的函数原型: matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=Non ...

  4. JavPlayer:AI破坏马赛克,大量马赛克破坏版影片流出

    这是最近几个月业界讨论比较火的话题,发酵到现在, 终于可以给大家总结下最近的马赛克破坏版影片到底是怎么回事? 马赛克破坏版,简单讲就是利用AI技术,在打有马赛克影片的马赛克基础上进行修复操作, 来实现 ...

  5. 在Windows下配置多个git账号

    1.生成并部署SSH key 安装好Git客户端后,打开git bash,输入以下命令生成user1的SSH Key: ssh-keygen -t rsa -C "user1@email.c ...

  6. SSH框架之Hibernate第四篇

    Hibernate中有两套实现数据库数据操作的方式 : hibernate前3天讲解的都是 : hibernate自己的操作方式(纯XML配置文件的方式) 另一种方式是基于JPA的操作方式(通过注解的 ...

  7. Android 单选列表对话框 setSingleChoiceItems

    private Button button; private final CharSequence[] items = { "北京", "上海", " ...

  8. 利用phpqrcode二维码生成类库合成带logo的二维码并且用合成的二维码生成海报(二)

    前期准备 引入phpqrcode类库(下载地址:https://download.csdn.net/download/weixin_37557729/11891240:支持彩色二维码的下载地址:htt ...

  9. Python安装常见问题(1):zipimport.ZipImportError: can't decompress data(此问题不解决pip安装不成功)

    在CentOS以及其他的Linux系统中遇到安装包安装错误的原因,大多数都是因为缺少依赖包导致的,所以对于错误:zipimport.ZipImportError: can’t decompress d ...

  10. Winclone 8 Mac增强汉化版 Windows分区备份迁移工具 8.0.1

    winclone 8 for Mac版是一款系统清理工具winclone的Mac平台版本,winclone Mac版可以将Bootcamp分区安装的windows进行克隆也可将克隆文件传回Bootca ...