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; |