日期:2014-05-16 浏览次数:20561 次
?
?
--显示游标 处理检索多行数据 --while循环 declare cursor emp_cursor is select * from emp where deptno=&部门编号; v_emp_row emp%rowtype; v_i integer:=0; begin if not emp_cursor%isopen then open emp_cursor; end if; fetch emp_cursor into v_emp_row; while emp_cursor%found loop dbms_output.put_line(v_emp_row.empno||' '||v_emp_row.ename||' '); fetch emp_cursor into v_emp_row; v_i:=v_i+1; end loop; dbms_output.put_line('利用游标一共处理了'||v_i||'行数据。。。'); if emp_cursor%isopen then close emp_cursor; end if; end emp_cursor; --简单loop循环(无参) declare cursor emp_cursor is select empno 员工编号,ename 员工姓名,nvl(sal,0) 员工工资,nvl(comm,0) 月奖金,12*(nvl(sal,0)+nvl(comm,0)) 年收入 from emp where deptno=&部门编号 order by empno asc; v_emprec emp_cursor%rowtype; begin if(not emp_cursor%isopen) then open emp_cursor; end if; fetch emp_cursor into v_emprec; loop exit when emp_cursor%notfound; dbms_output.put_line(v_emprec.员工编号); fetch emp_cursor into v_emprec; end loop; if(emp_cursor%isopen) then close emp_cursor; end if; end; --for循环(无参) declare cursor emp_cursor is select empno 员工编号,ename 员工姓名,nvl(sal,0) 员工工资,nvl(comm,0) 月奖金,12*(nvl(sal,0)+nvl(comm,0)) 年收入 from emp where deptno=&部门编号 order by empno asc; begin for i in emp_cursor loop dbms_output.put_line(i.员工编号); end loop; end; --带参数游标的使用 --for循环(带参) declare cursor emp_cursor(p_empno emp.empno%type) is select empno 员工编号,ename 员工姓名,nvl(sal,0) 员工工资,nvl(comm,0) 月奖金,12*(nvl(sal,0)+nvl(comm,0)) 年收入 from emp where deptno=&部门编号 order by empno asc; begin for i in emp_cursor(&部门编号) loop dbms_output.put_line(i.员工编号); end loop; end; --while循环(带参) declare cursor emp_cursor(p_empno emp.empno%type) is select empno 员工编号,ename 员工姓名,nvl(sal,0) 员工工资,nvl(comm,0) 月奖金,12*(nvl(sal,0)+nvl(comm,0)) 年收入 from emp where deptno=&部门编号 order by empno asc; v_emprec emp_cursor%rowtype; begin if(not emp_cursor%isopen) then open emp_cursor(&部门编号); end if; fetch emp_cursor into v_emprec; while(emp_cursor%found) loop dbms_output.put_line(v_emprec.员工编号); fetch emp_cursor into v_emprec; end loop; if(emp_cursor%isopen) then close emp_cursor; end if; end; --简单循环(带参) declare cursor emp_cursor(p_empno emp.empno%type) is select empno 员工编号,ename 员工姓名,nvl(sal,0) 员工工资,nvl(comm,0) 月奖金,12*(nvl(sal,0)+nvl(comm,0)) 年收入 from emp where deptno=&部门编号 order by empno asc; v_emprec emp_cursor%rowtype; begin if(not emp_cursor%isopen) then open emp_cursor(&部门编号); end if; fetch emp_cursor into v_emprec; loop exit when emp_cursor%notfound; dbms_output.put_line(v_emprec.员工编号); fetch emp_cursor into v_emprec; end loop; if(emp_cursor%isopen) then close emp_cursor; end if; end; --隐式游标的使用 --按照给定的部门编号,删除该部门中的所有雇员信息 declare v_input_deptno emp.deptno%type; v_count number:=-1; begin v_input_deptno:=&部门编号; select count(deptno) into v_count from emp where deptno=v_input_deptno; if(v_count>0) then delete from emp where deptno=v_input_deptno; --利用隐式游标的属性判断删除是否成功 if(sql%found) then dbms_output.put_line('删除成功。。。'); commit; else dbms_output.put_line('删除失败。。。'); rollback; end if; else dbms_output.put_line('该部门不存在。。。'); end if; end; --更新游标 通常是为了进行更新操作,更新数据使用的游标 --按照给定的工种,更新雇员的工资,工资上调10% declare cursor emp_cursor is select * from emp where job='&工种' for update of sal; begin for i in emp_cursor loop update emp set sal=i.sal*1.1 where current of emp_cursor; if(sql%found) then dbms_output.put_line('更新成功。。。'); else dbms_output.put_line('更新失败。。。'); end if; end loop; commit; end; --更新游标的for update 可以锁定游标正在处理的行记录,从而避免由于并发访问 --所带来的数据更新丢失问题。保证并发事务的有效处理