以下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