游标

说明

查询结果的光标,相当于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. C++ std::vector 基本用法

    #include <iostream> #include <vector> using namespace std; int main() { // 初始化的方式 std::v ...

  2. 使用admin的步骤、必知必会13条、单表的双下划线、外键的操作、多对多的操作:

    MVC M: model 模型 与数据库交互 V: view 视图 HTML C:controller 控制器 流程 和 业务逻辑 MTV M:model ORM T:template 模板 HTML ...

  3. Python 接口自动化常用方法封装

    #!/usr/bin/env python # -*- coding:utf-8 -*- # ************************************* # @Time : 2019/ ...

  4. RabbitMQ与Spring的框架整合之Spring Cloud Stream实战

    1.RabbitMQ与Spring Cloud Stream整合实战.SpringCloud Stream整体结构核心概念图,如下所示: 图示解释:Outputs输出,即消息的发送端.Inputs输入 ...

  5. Add an Editor to a Detail View 将编辑器添加到详细信息视图

    In this lesson, you will learn how to add an editor to a Detail View. For this purpose, the Departme ...

  6. 关于vue-detools chorme创建安装完成,但是控制台不显示问题

    搜了一下发现挺多人遇到这个问题的,绝大多数的回答都是在main.js中添加下面代码 Vue.config.devtools = true; 但是发现并不行. 后来看到有人说刷新然后在按F12就好了,居 ...

  7. echarts背景颜色渐变的三种类型

    // 线性渐变,多用于折线柱形图,前四个参数分别是 x0, y0, x2, y2, 范围从 0 - 1,相当于在图形包围盒中的百分比,如果 globalCoord 为 `true`,则该四个值是绝对的 ...

  8. Java - IO System类支持和缓冲流

    System类的支持和缓冲流 System类对IO的支持 在System类中,为了支持IO操作提供了三个常量: 错误输出: public static final PrintStream err; 输 ...

  9. PHP获取二维数组指定字段值的和

    array_sum(array_column($arr, 'num')); //获取二维数组 num字段的和 $arr = [ [ 'device_uid' => '123456', 'num' ...

  10. 单词倒序(java)

    如何将一串单词组成的字符串倒序呢?如:" we go to school" 变成"school to go we "java代码实现: public stati ...