oracle学习笔记(十八) PL/SQL 游标
游标
说明
查询结果的光标,相当于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;
/
游标使用
- 声明游标: cursor 游标名称[(参数列表)] IS select_statement;
- 打开游标: open 游标名称[(参数列表)];
- 从游标中提取数据(移动游标)到变量: FETCH 游标名称 INTO 变量列表....;
- 关闭游标: 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 游标的更多相关文章
- Oracle学习笔记十 使用PL/SQL
PL/SQL 简介 PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言,是对 SQL 的扩展,它支持多种数据类型,如大对象和集合类型,可使用 ...
- oracle学习笔记4:PL/SQL
PL/SQL是没命名的存储过程,函数,触发器,PL/SQL块的语法格式如下: [declare] --声明部分,可选 begin --执行部分,必须 [exception] --异常处理部分,可选 e ...
- Oracle 学习笔记 17 -- 异常处理(PL/SQL)
程序异常是在操作期间正常,出现在节目的准备过程是不可避免的例外.但是,必须有一个相应的异常处理机 制,以保证程序的正常运行.PL/SQL程序运行过程中出现的错误.称为异常. 一个优秀的程序都应该可以正 ...
- python3.4学习笔记(十八) pycharm 安装使用、注册码、显示行号和字体大小等常用设置
python3.4学习笔记(十八) pycharm 安装使用.注册码.显示行号和字体大小等常用设置Download JetBrains Python IDE :: PyCharmhttp://www. ...
- Oracle学习笔记十二 子程序(存储过程、自定函数)和程序包
子程序 子程序:命名的 PL/SQL 块,编译并存储在数据库中. 子程序的各个部分: 1.声明部分 2.可执行部分 3.异常处理部分(可选) 子程序的分类: 1.过程 - 执行某些操作 2.函数 ...
- Oracle学习笔记(十二)
十三.存储过程和存储函数1.掌握存储过程(相当于建立一个函数或者方法体,然后通过外部对其调用) 指存储在数据库中供所有程序调用的子程序叫做存储过程或存储函数. 相同点: 完成特定功能的程序 区别: 是 ...
- oracle学习(二)pl/sql基础
pl/sql组成:DDL DML DCL pl/sql特点: SQL&PL/SQL编译器集成PL/SQL,支持SQL所有范围的语法 支持CASE语句和表达式 继承和动态方法释放 类型进化.属性 ...
- Oracle学习笔记十四 内置程序包
扩展数据库的功能 为 PL/SQL 提供对 SQL 功能的访问 用户 SYS 拥有所有程序包 是公有同义词 可以由任何用户访问 一些内置程序包 程序包名称 说明 STANDARD和DBMS_STAND ...
- (C/C++学习笔记) 十八. 继承和多态
十八. 继承和多态 ● 继承的概念 继承(inheritance): 以旧类为基础创建新类, 新类包含了旧类的数据成员和成员函数(除了构造函数和析构函数), 并且可以派生类中定义新成员. 形式: cl ...
- oracle 学习(五)pl/sql语言存储过程&包
首先搞清楚俩概念 存储过程(procedure)&程序包(package) 存储过程:数据库对象之一,可以理解为数据库的子程序,在客户端和服务器端可以直接调用它.触发器是与表直接关联的特殊存储 ...
随机推荐
- C#关于MySQL中文乱码问题
本人在写一个测试demo的时候,遇到一个问题就是添加的中文数据在数据库定义的明明是varchar类型,但是显示出来还是乱码,不过还是自己粗心导致的问题. 以下三种方式可以自查一下: 1. 首先检查 ...
- python __iter__和__getitem__区别
__getitem__ 单独实现这个魔法函数,可以让这个类成为一个可迭代的对象,并且可以通过使用下标获取类中元素值下标的元素 class Library(object): def __init__(s ...
- NXP恩智浦VEGA织女星开发板免费申请!
前言 大概两周前申请了一块NXP恩智浦的开发板,今天终于收到了!在这里推荐给大家,官方网站刚上线一个月左右,目前申请的人还不算多,感兴趣的朋友可以申请一个,体验一下这个四核性能怪兽.大厂就是大气,包装 ...
- Python 从入门到进阶之路(五)
之前的文章我们简单介绍了一下 Python 的函数,本篇文章我们来看一下 Python 中的面向对象. Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是 ...
- Kafka简明教程
作者:柳树之 www.jianshu.com/p/7b77723d4f96 Kafka是啥?用Kafka官方的话来说就是: Kafka is used for building real-time d ...
- .net Core 使用AutoMapper
在我们的项目中慢慢的要把数据库的实体模型和视图模型进行分离,防止被人拿到我们表字段.在学校的时候自己只是有将很多数据库模型,写成一个视图模型返回到前台. 首先我们把这两个包引入项目中去. 然后我们创建 ...
- zabbix监控服务
1.模板的重要 1.手动添加监控比较麻烦,监控项 -> 图形 -> 触发器. 问题: 1.例如: 100台服务器需要检查81端口 2.例如: 100台服务器81改成82 解决: 使用模 ...
- Spring Boot 2 + Thymeleaf:服务器端表单验证
表单验证分为前端验证和服务器端验证.服务器端验证方面,Java提供了主要用于数据验证的JSR 303规范,而Hibernate Validator实现了JSR 303规范.项目依赖加入spring-b ...
- Python安装常见问题(1):zipimport.ZipImportError: can't decompress data(此问题不解决pip安装不成功)
在CentOS以及其他的Linux系统中遇到安装包安装错误的原因,大多数都是因为缺少依赖包导致的,所以对于错误:zipimport.ZipImportError: can’t decompress d ...
- Linux系统学习 八、SSH服务—SSH远程管理服务
1.SSH简介 ssh(安全外壳协议)是Secure Shell的缩写,是建立在应用层和传输层基础上的安全协议.传输的时候是经过加密的,防止信息泄露,比telnet(明文传递)要安全很多. ftp安装 ...