高级显式游标
项目目标
1.使用游标从dept表中依次取出部门的代号和名称。将这两个参数传送到另外一个游标当中,取出emp表当中工作在该部门的雇员姓名、工作、雇佣日期、工资信息。其输出如下:
Department Number : 10 Department Name : ACCOUNTING
KING PRESIDENT 17-NOV-81 5000
CLARK MANAGER 09-JUN-81 2450
MILLER CLERK 23-JAN-82 1300
Department Number : 20 Department Name : RESEARCH
JONES MANAGER 02-APR-81 2975
FORD ANALYST 03-DEC-81 3000
SMITH CLERK 17-DEC-80 800
SCOTT ANALYST 09-DEC-82 3000
ADAMS CLERK 12-JAN-83 1100
项目目标
2.使用游标来修改emp表中雇员的工资,使得工资等于或者超过1500的雇员工资增加%20,没有超过1500的增加%30
所需知识点
使用带参数的游标
判断什么时候在游标中使用 FOR UPDATE 子句
判断什么时候在游标中使用 WHERE CURRENT OF 子句
写出一个使用子查询的游标
带参数的游标
语法:
当打开游标时,向游标传递参数,并执行查询.
每次可以用不同的参数来打开一个游标.
CURSOR cursor_name
[(parameter_name datatype, ...)]
IS
select_statement;
带参数的游标
向 WHERE 子句中传递部门号和工作这两个参数.
例子:
DECLARE
CURSOR emp_cursor
(p_deptno NUMBER, p_job VARCHAR2) IS
SELECT empno, ename
FROM emp
WHERE deptno = p_deptno
AND job = p_job;
p_emp_cursor emp_cursor%ROWTYPE;
BEGIN
OPEN emp_cursor(10, 'CLERK');
loop
fetch emp_cursor into p_emp_cursor ;
exit when emp_cursor%NOTFOUND;
dbms_output.put_line(p_emp_cursor.empno);
dbms_output.put_line(p_emp_cursor.ename);
end loop;
close emp_cursor;
end;
FOR UPDATE 子句
语法:
使用FOR UPDATE语句使得在事务运行期间,其它事务对同一数据的访问被拒绝。
在update 或者 delete之前,该行数据被加锁。
SELECT...
FROM...
FOR UPDATE [OF column_reference][NOWAIT];
FOR UPDATE 子句
查出在 30号部门工作的所有员工.
例子:
DECLARE
CURSOR emp_cursor IS
SELECT empno, ename, sal
FROM emp
WHERE deptno = 30
FOR UPDATE OF sal NOWAIT;
p_emp_cursor emp_cursor%ROWTYPE;
BEGIN
open emp_cursor;
loop
fetch emp_cursor into p_emp_cursor ;
exit when emp_cursor%NOTFOUND;
dbms_output.put_line(p_emp_cursor.empno);
dbms_output.put_line(p