天天看点

oracle光标的使用

以下plsql程序用的scott用户的dept,emp表。

1.光标的使用:

1 --查询并打印员工的姓名名和薪水
 2 /*
 3 光标属性:
 4   %found  %notfound
 5 
 6 */
 7 
 8 set serveroutput on;
 9 
10 declare
11 
12   CURSOR C1 IS SELECT ENAME,SAL FROM EMP;
13   PENAME EMP.ENAME%TYPE;
14   PSAL EMP.SAL%TYPE;
15  
16 BEGIN
17 
18   --打开光标
19   OPEN C1;  
20  
21   LOOP
22    
23     --取一条记录,
24     FETCH C1 INTO PENAME,PSAL ;
25     EXIT WHEN C1%notfound;
26     --1.循环什么时候退出  2.FETCH一定能取到数据吗
27     DBMS_OUTPUT.PUT_LINE(PENAME||'的薪水是'||PSAL);
28   END LOOP;
29  
30   --关闭光标
31   CLOSE C1;
32 
33 END;
34 /      

2.给员工涨工资

1 --给员工涨工资, 总裁涨1000 ,经理涨800 ,其他 400
 2 
 3 set serveroutput on;
 4 
 5 declare
 6 
 7   cursor cemp is select empno,job from emp;
 8   pempno emp.empno%type;
 9   pjob emp.job%type;
10  
11  
12 begin
13  
14   open cemp;
15   loop
16  
17     fetch cemp into pempno,pjob ;
18     exit when cemp%notfound;
19    
20     IF pjob = 'PRESIDENT' then  update emp set sal= sal + 1000 where empno = pempno;
21     ELSIF pjob = 'MANAGER' then  update emp set sal=sal+800 where empno = pempno;
22     ELSE update emp set sal=sal + 400 where  empno = pempno;
23     END IF;
24    
25   end loop;
26  
27   close cemp;
28 
29   commit;
30  --对应oracle ,默认的事务隔离级别是 read committed
31  --事务的ACID :原子性 一致性 隔离性 持久性
32   SYS.DBMS_OUTPUT.PUT_LINE('涨工资完成');
33  
34  
35 
36 end;
37 
38 /      

3.操作带参数的光标

1 --查询某个部门中员工的姓名
 2 
 3 set serveroutput on;
 4 
 5 declare
 6 
 7   cursor cemp(dno number) is select ename from emp where deptno = dno;
 8   pename emp.ename%type;
 9  
10 begin
11   open cemp(10);
12   dbms_output.put_line('10号部门的人有:');
13   loop
14    
15     fetch cemp into pename;
16     exit when cemp%notfound;
17     dbms_output.put_line(pename);
18  
19   end loop;
20  
21  
22  
23   close cemp;
24 
25 end;
26 
27 /      

知识点出处: http://www.imooc.com/learn/360

继续阅读