ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 数据库:Oracle之光标

数据库:Oracle之光标

原创 Linux操作系统 作者:果果的空间 时间:2013-08-14 10:26:29 0 删除 编辑
1.光标:是一个PL/SQL结构,利用光标可以命名这些工作区,并通过光标访问工作区中的信息。
2.光标有两种类型:系统预定义光标(隐式光标)和用户自定义光标(显示光标)。
3.隐式光标:它的名字为SQL,隐式光标区中主要是保存执行SQL语句的一些状态信息或统计信息。通过光标的几个属性可以访问到这些信息
1)SQL%ROWCOUNT:该属性为刚执行完的一条SQL语句处理了多少条记录
2)SQL%FOUND:该属性返回一个逻辑值,表示刚执行的一条DML语句是否处理了记录,无,返回false,有,返回true
3)SQL%NOTFOUND:表示没有处理的记录,于2)相反
4.用户自定义光标(显示光标):用来处理查询语句检索到多行数据,返回一个集合(结果关系),直接交给属于过程化语言的PL/SQL是行不通的,所以使用显示光标来解决这个问题。
5.SQL语言是面向集合的,过程化语言(如:PL/SQL)处理不了集合。
6.显示光标解决问题思路如下:1)将一个select 语句的查询结果放到一个命名的工作区中(光标区);2)从光标区中逐行读取数据并加以处理(顺序读取)
7.显示光标的使用步骤
1)定义光标:Declare cursor c1 is select .....for update;
2)打开光标:open c1;
3)读取光标区数据:fetch c1 into 变量
4)关闭光标:close c1;
8. 实例:(有点问题,编译通过,查询也通过,但定义的结果无法输出)
create or replace procedure emp_sals is
cursor c1 is
select empno, sal from emp order by sal for update;
emp_num integer :=0; --保存涨工资的职工计数
s_sal number(6); --保存工资总额
e_eno emp.empno%TYPE; --保存正在处理的员工编号
e_sal emp.sal%TYPE; --保存正在处理的员工工资
stat_num integer :=0; --统计一条SQL语句处理了多少条记录
results boolean;

begin
open c1;
select sum(sal) into s_sal from emp; --将没有涨工资之前的工资总和保存在s_sal中
while s_sal < 50000.00
loop
fetch c1 into e_eno, e_sal; --从光标中读取一个员工的empno 和 sal
exit when c1%NOTFOUND; --如果没有找到记录,退出循环
update emp set sal = sal*1.1
where empno=e_eno; --涨当前员工的工资
s_sal := s_sal + e_sal*0.1; --将涨工资的部分增加到总数中
emp_num := emp_num + 1; --员工计数器加1
stat_num := SQL%ROWCOUNT; --统计一条SQL语句处理了多少条记录
results := SQL%NOTFOUND;
dbms_output.put_line('resultsstat_num 数据'); --也没有起作用
end loop;

--insert into msg values(emp_num, s_sal); --将涨工资人数及当前工资总额两个统计数据输出
dbms_output.put(emp_num||' '||s_sal); --这个为什么无法输出结果
dbms_output.put(stat_num); --也没有起作用
close c1;
commit;
end emp_sals;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29056818/viewspace-768446/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2013-07-18

  • 博文量
    60
  • 访问量
    117224