游标

说明

查询结果的光标,相当于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. oracle 查询数据一直提示:“error code [17004]; 无效的列类型”111111

    oracle 查询数据一直提示:“error code [17004]; 无效的列类型”111111 问题场景:oracle,jpa,insert原因:插入的字段中有null.导致类型转换出问题,这个 ...

  2. 使用python - selenium模拟登陆b站

    思路 输入用户名密码点击登陆 获取验证码的原始图片与有缺口的图片 找出两张图片的缺口起始处 拖动碎片 功能代码段 # 使用到的库 from selenium import webdriver from ...

  3. python3 连接 zookeeper

    zookeeper的增 删 改 查 watch监听. from kazoo.client import KazooClient import time,os import timeit os.chdi ...

  4. SpringCloud微服务(02):Ribbon和Feign组件,实现服务调用的负载均衡

    本文源码:GitHub·点这里 || GitEE·点这里 一.Ribbon简介 1.基本概念 Ribbon是一个客户端的负载均衡(Load Balancer,简称LB)器,它提供对大量的HTTP和TC ...

  5. Gradle如何在任务失败后继续构建

    如果我们运行Gradle构建并且其中一项任务失败,则整个构建将立即停止.因此,我们可以快速反馈构建状态.如果我们不想这样做,并且希望Gradle执行所有任务,即使某些任务可能失败了,我们也可以使用命令 ...

  6. 一起学SpringMVC之Json

    本文主要以一个简单的小例子,简述SpringMVC开发中,Json的相关应用,仅供学习分享使用,如有不足之处,还请指正. 什么是Json ? JSON 指的是 JavaScript 对象表示法(Jav ...

  7. 工作总结汇报公司介绍产品宣传品牌展示企业文化PPT模

    清晰明了:在工作总结会议上都是要严肃为主,搞的花里胡哨既不好看也让领导有不好的影响:微粒体:模板样式立体效果非常好,能够一把将观众眼球给吸引住:样式齐全:各种PPT样式都有,能够承载工作汇报各种内容: ...

  8. Data Management Technology(2) -- Data Model

    1.Data Model Model Is the abstraction of real world Reveal the essence of objects, help people to lo ...

  9. SQL Server要拷贝默认目录下的使用数据库需要停止的服务

  10. ODA: After Apply ODA 12.2.1.2.0 Patch, Unable to Create TableSpace Due to [ORA-15001: diskgroup "DATA" does not exist or is not mounted | ORA-15040: diskgroup is incomplete] (Doc ID 2375553.1)

    ODA: After Apply ODA 12.2.1.2.0 Patch, Unable to Create TableSpace Due to [ORA-15001: diskgroup &quo ...