光标(游标)概念引入
就是一个结果集(查询或者其他操作返回的结果是多个时使用)
定义一个光标
cursor c1 is select ename from emp;

从光标中取值
打开光标:
--open c1;(打开光标执行查询)
关闭光标:
--close c1;(关闭游标释放资源)
取一行光标的值:
--fetch c1 into pename;(取一行到变量中)

fetch的作用:
--把当前指针指向的记录返回
--将指针指向下一条记录

使用光标查询员工姓名和工资,并打印
declare
--定义一个光标
cursor cemp is select ename,sal from emp;
--为光标定义对应的变量
pename emp.ename%type;
psal emp.sal%type;
begin
--打开光标
open cemp;

loop
--取一条记录
fetch cemp into pename,psal;

--思考:1、循环什么时候退出? 2、fetch不一定能取到记录
--exit when 没有取到记录;

exit when cemp%notfound;

--打印
dbms_output.put_line(pename||'的薪水是'||psal);

end loop;
--关闭光标
close cemp;
end;

1、光标的属性:
%found 取到值就是found
%notfound 取不到是这个

示例:给员工涨工资(根据职位涨工资)
总裁涨1000
经理涨800
其他员工涨400
更改表中的job为empjob,

--涨工资之前的薪水
select ename,job,sal from emp;

set serveroutput on
declare
--定义光标代表给哪些员工涨工资
--alter table 'SCOTT' 'EMP' rename column 'JOB' to empjob
--定义一个光标
cursor cemp is select empno,empjob from emp;
--为光标定义对应的变量
pempno emp.empno%type;
pjob emp.empjob%type;
begin
rollback;
--打开光标
open cemp;

loop
--取一条记录
fetch cemp into pempno,pjob;
exit when cemp%notfound;

--判断员工的职位
if pjob = 'PRESIDENT' then update emp set sal=sal+1000 where empno=pempno;
elsif pjob='MANAGER' then update emp set sal=sal+800 where empno=pempno;
else update emp set sal=sal+400 where empno=pempno;
end if;
end loop;
--关闭光标
close cemp;

--对于oracle,默认的事务隔离级别是read committee
--事务的ACID(原子性/一致性/隔离性/持久性)
commit;
DBMS_OUTPUT.PUT_LINE('涨工资完成');
end;

1、光标的属性;
%found(取到值为true)
%notfound(取不到值为true)
%isopen(判断光标是否打开,因为oracle数据库默认一个会话中打开的光标数是有限制的300个)
%rowcount(影响的行数,即已经被提取的行数,并非集合中的总行数)。

事例1:%isopen用法

set serveroutput on
declare
--定义一个光标
cursor cemp is select empno,empjob from emp;
--为光标定义对应的变量
pempno emp.empno%type;
pjob emp.empjob%type;
begin
--打开光标
open cemp;

if cemp%isopen then
DBMS_OUTPUT.PUT_LINE('光标已经打开');
else
DBMS_OUTPUT.PUT_LINE('光标没有打开');

end if;
--关闭光标
close cemp;
end;

事例2:%rowcount用法

set serveroutput on
declare
--定义一个光标
cursor cemp is select empno,empjob from emp;
--为光标定义对应的变量
pempno emp.empno%type;
pjob emp.empjob%type;
begin
--打开光标
open cemp;
loop
--取出一条记录
fetch cemp into pempno,pjob;
exit when cemp%notfound;

--打印rowcount的值
DBMS_OUTPUT.PUT_LINE('rowcount'||cemp%rowcount);

end loop;
--关闭光标
close cemp;
end;

2、光标的限制,默认情况下,orcle数据库只允许在同一个会话中,打开300个光标
--切换到管理员
conn sys/1234 as sysdba
--查看参数
show parameter cursor

修改光标数量的限制
alter system set open_cursors=400 scope=both;

scope的取值有三个
both(后两个同时更改),memory,spfile(数据库需要重启)

3、带参数的光标
--查询某个部门中员工的姓名
set serveroutput on
declare
---定义带参数的光标
cursor cemp(dno number) is select ename from emp where deptno=dno;
pename emp.ename%type;

begin
--打开光标
open cemp(10);
loop
--取出一条记录
fetch cemp into pename;
exit when cemp%notfound;

DBMS_OUTPUT.PUT_LINE(pename);

end loop;
--关闭光标
close cemp;
end;

***********光标是SQL中代替集合(数组)使用的参数.**********

最新文章

  1. 【python】用setup安装自定义模块和包
  2. 解决Ubuntu发热量大的问题
  3. java中实现线程同步
  4. "稀奇古怪的"delete this
  5. jquery 点击事件
  6. BPM的四大主要类型
  7. 防范ARP网关欺骗, ip mac双向绑定脚本
  8. 装逼利器之DLog -DEBUG
  9. Python: 设计模式 之 工厂模式例(1)
  10. Java多线程学习笔记--生产消费者模式
  11. vue2入门之vue-cli
  12. CentOS7部分调优命令
  13. 使用gulp和browser-sync实现浏览器自动刷新
  14. Rancher学习笔记-----1.分享链接
  15. 字符集之在UTF-8中,一个汉字为什么需要三个字节?
  16. 【WPF】【UWP】借鉴 asp.net core 管道处理模型打造图片缓存控件 ImageEx
  17. [转]Angular4 自制分页控件
  18. ubuntu apt-get failed
  19. PHPweb应用攻击总结(转)
  20. VS2013编译Qt5.2.1 32位静态库debug-and-release版及结果分享

热门文章

  1. linux环境下maven的安装配置
  2. java System.arrayCopy使用说明
  3. eclipse启动报错:An error has occurred.See the log file D:\eclipse\configuration\1552616709202.log
  4. python 内置方法的时间复杂度
  5. unity的prefab(预设)例子
  6. 彻底解密C++宽字符(二)
  7. bzoj2505: tickets
  8. PHP扩展类ZipArchive实现压缩解压Zip文件和文件打包下载 && Linux下的ZipArchive配置开启压缩 &&搞个鸡巴毛,写少了个‘/’号,浪费了一天
  9. 【DataGuard】部署Data Guard相关参数详解 (转载)
  10. 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #12 使用Memory Cgroup限制内存使用量