oracle学习笔记(十八) PL/SQL 游标
2023-02-18 16:37:03 时间
游标
说明
查询结果的光标,相当于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游标
引用游标,动态游标
动态游标
相关文章
- [PHP] 重回基础(date函数和strtotime函数)
- [PHP]垃圾回收机制
- [HTML5] Canvas绘制简单图片
- [PHP] 广度优先搜索匹配网站所有链接
- [PHP] 最简单的权限控制设计
- [PHP] substr占用内存谨慎使用
- [PHP] 使用ftell和fseek函数直接定位文件位置获取部分数据
- [HTML5] Canvas绘制简单形状
- [PHP]socket的连接超时 与 读取/写入超时
- [PHP]引用返回与节省内存
- [PHP]实体类基类和序列化__sleep问题
- [PHP]日志处理error_log()函数和配置使用
- [PHP] 使用反射实现的控制反转
- [PHP] debug_backtrace()可以获取到代码的调用路径追踪
- [Redis] redis数据备份恢复与持久化
- [PHP] 商品类型规格属性后台管理(代码流程备忘)
- [TCP/IP] TCP的传输连接管理
- [PHP] sys_get_temp_dir()和tempnam()函数报错与环境变量的配置问题
- [PHP] ubuntu下使用uuid扩展获取uuid
- [PHP] MIME邮件协议的multipart类型