Oracle11g学习-游标

Oracle

游标

1 显式游标

游标是映射在结果集中一行数据上的位置实体,使用游标,便可以访问结果集中的任意一行数据了,将游标放置到某行后,即可对该行数据进行操作;从上向下依次迭代结果集。

1.1  游标语法

【定义语法】

CURSOR <游标名> IS <SELECT 语句> ;

【操作】

     OPEN <游标名> --打开游标

     FETCH <游标名> INTO 变量1,变量2,变量3,....变量n,;

                或者

     FETCH <游标名> INTO 行对象;   --取出游标当前位置的值

     CLOSE <游标名> --关闭游标

【属性】

    %NOTFOUND --如果FETCH语句失败,则该属性为"TRUE",否则为"FALSE";

    %FOUND --如果FETCH语句成果,则该属性为"TRUE",否则为"FALSE";

    %ROWCOUNT --返回游标当前行的行数;

    %ISOPEN --如果游标是开的则返回"TRUE",否则为"FALSE";

1.2  游标使用

1、使用游标显示员工表中所有的员工姓名、工作和工资

declare

cursor cur_emp is select ename,job,sal from emp;

    p_ename emp.ename%type;

    p_job emp.job%type;

    p_sal emp.sal%type;

begin

--打开游标

open cur_emp;

loop

--取游标数据,从上往下移动一行

fetch cur_emp into p_ename, p_job, p_sal;

--如果下移后没有数据,则退出

Exit when cur_emp%notfound;

--如果存在数据,则处理

        dbms_output.put_line('姓名为:'|| p_ename ||',工作为:'|| p_job ||',工资为:'|| p_sal);

end loop;

--关闭游标

close cur_emp;

end;

 2、使用游标显示指定部门下的所有的员工姓名、工作和工资

代参数的游标

【定义】

CURSOR <游标名>(参数列表) IS <SELECT 语句>;

【示例】

declare

cursor cur_emp(dno emp.deptno%type)isselect ename,job,sal from emp where deptno=dno;

    r_cur_emp cur_emp%rowtype;

begin

--打开游标

open cur_emp(20);

loop

--取游标数据,从上往下移动一行

fetch cur_emp into r_cur_emp;

--如果下移后没有数据,则退出

exitwhen cur_emp%notfound;

--如果存在数据,则处理

        dbms_output.put_line('姓名为:'|| r_cur_emp.ename ||',工作为:'|| r_cur_emp.job ||',工资为:'|| r_cur_emp.sal);

endloop;

--关闭游标

close cur_emp;

end;

--参考:使用while循环实现

declare

cursor cur_dept_emps(dno emp.deptno%type)isselect ename,job,sal from emp where deptno=dno;

  emp_info cur_dept_emps%rowtype;

begin

open cur_dept_emps(20);

fetch cur_dept_emps into emp_info;

while cur_dept_emps%found

loop

    dbms_output.put_line('员工姓名为:'||emp_info.ename||',工作为:'||emp_info.job||',工资为:'||emp_info.sal);

fetch cur_dept_emps into emp_info;

endloop;

close cur_dept_emps;

end;

--参考:使用for循环实现

declare

cursor cur_dept_emps(dno emp.deptno%type)isselect ename,job,sal from emp where deptno=dno;

  emp_info cur_dept_emps%rowtype;

begin

for emp_info in cur_dept_emps(20)

loop

if cur_dept_emps%foundthen

    dbms_output.put_line('员工姓名为:'||emp_info.ename||',工作为:'||emp_info.job||',工资为:'||emp_info.sal);

endif;

endloop;

end;

 3、使用游标按员工的工种涨工资,总裁800,经理600,其他人员300

declare

cursor cur_emp is select empno,job from emp;

    p_empno emp.empno%type;

    p_job emp.job%type;

begin

--打开游标

open cur_emp;

loop

--取游标数据,从上往下移动一行

fetch cur_emp into p_empno, p_job;

--如果下移后没有数据,则退出

exit when cur_emp%notfound;

--如果存在数据,则处理

if 'PRESIDENT'= p_job then

update emp set sal = sal +800 where empno = p_empno;

elsif  'MANAGER'= p_job then

update emp set sal = sal +600 where empno = p_empno;

else

update emp set sal = sal +300 where empno = p_empno;

end if;

end loop;

--关闭游标

close cur_emp;

--提交修改

commit;

end;

1.2      隐式游标

当执行一个SQL语句时,Oracle会自动创建一个隐式游标,隐式游标主要处理DML语句,该游标的名称是sql。隐试游标不能进行"OPEN","CLOSE","FETCH"这些操作。

属性:

    %NOTFOUND --如果DML语句没有影响到任何一行时,则该属性为"TRUE",否则为"FALSE";

    %FOUND --如果DML语句影响到一行或一行以上时,则该属性为"TRUE",否则为"FALSE";

%ROWCOUNT --返回游标当最后一行的行数;

【示例】

/*

通过更新语句判断隐式游标的存在

*/

begin

update emp set comm=comm +300where empno =7369;

ifsql%notfoundthen

       dbms_output.put_line('empno对应的员工不存在');

else

       dbms_output.put_line('empno对应的员工数为:'||sql%rowcount);

endif;

end;


猜你喜欢

转载自blog.csdn.net/chenzuyibao/article/details/80539438