ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 数据库:Oracle显示光标统计信息,光标for循环,带参数的光标

数据库:Oracle显示光标统计信息,光标for循环,带参数的光标

原创 Linux操作系统 作者:果果的空间 时间:2013-08-14 10:30:49 0 删除 编辑
1.显示光标统计信息:与隐式光标统计信息含义不尽相同,这些信息都是针对fetch而言:
1)SQL%COUNT:表示到目前为止,FETCH语句从光标c1中读了多少个记录
2)SQL%FOUND:该属性返回一个逻辑值,返回true,表示最后一次执行的FETCH语句从光标c1中读到记录;返回false,表示没有读到记录(光标区中的内容已经读完)
3)SQL%NOTFOUND:表示没有处理的记录,于2)相反
2.Fetch语句中即使没有读到数据,也不会产生NO_DATA_FOUND的例外
3.光标for循环:
1)如何打开光标?执行for循环时,循环控制首先打开光标,不使用open语句
2)如何读光标区?循环变量的取值就是读取光标区,每次从光标区读取一个记录并执行一次。
3)如何判断读完?fetch语句及光标区结束的判断也不需要了,这些都包括在for循环本身的功能
4)如何关闭光标?执行完循环后,光标自动关闭,不使用close语句
例子:
PL/SQL语句编译没有问题,但没有进行update操作
create or replace procedure emp_sals_forcircle 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; --保存正在处理的员工工资
begin
--open c1;
select sum(sal) into s_sal from emp; --将没有涨工资之前的工资总和保存在s_sal中
dbms_output.put_line('start sal is: '||s_sal); --可以输出
--while s_sal < 50000.00
for r in c1
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; --涨当前员工的工资
dbms_output.put_line('s_sal is:'||s_sal); --这个输出结果为null,为什么?
s_sal := s_sal + e_sal*0.1; --将涨工资的部分增加到总数中
emp_num := emp_num + 1; --员工计数器加1
dbms_output.put_line('empno:'||r.empno||' each time: '||r.sal); --输出每个员工的工资
end loop;

dbms_output.put_line(emp_num||'employee-- end sal is:'||s_sal); --输出涨之后的员工工资
-- close c1;
commit;
end emp_sals_forcircle;
执行结果如下
SQL> exec emp_sals_forcircle;

start sal is: 29025
s_sal is:29025
empno:7369 each time: 800
s_sal is:
empno:7900 each time: 950
s_sal is:
empno:7876 each time: 1100
s_sal is:
empno:7521 each time: 1250
s_sal is:
empno:7654 each time: 1250
s_sal is:
empno:7934 each time: 1300
s_sal is:
empno:7844 each time: 1500
s_sal is:
empno:7499 each time: 1600
s_sal is:
empno:7782 each time: 2450
s_sal is:
empno:7698 each time: 2850
s_sal is:
empno:7566 each time: 2975
s_sal is:
empno:7788 each time: 3000
s_sal is:
empno:7902 each time: 3000
s_sal is:
empno:7839 each time: 5000
results_counts :
14employee-- end sal is:

PL/SQL procedure successfully completed
4.带参数的光标:(不会用,不常用)
光标的定义缺乏灵活性和通用性,可以在一个PL/SQL中定义若干个光标,为了使光标的适用性更强,PL/SQL支持带参数的光标。
cursor c1(dno char(:=3)) is
select * from emp where emp.deptno=dno;
但这个有问题,还没有解决:Compilation errors for PROCEDURE WEIXL.EMP_CANSHU
Error: PLS-00103: Encountered the symbol "(" when expecting one of the following:

:= ) , default varying character large
Line: 3
Text: cursor c1(dno char(:=3)) is

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

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

注册时间:2013-07-18

  • 博文量
    60
  • 访问量
    117226