-- 给员工涨工资,总裁1000,经理800,其他400
set serveroutput on
declare
--定义光标代表给哪些员工涨工资
--alter table "SCOTT"."EMP" rename column "JOB" to empjob
--表中job提示蓝色,触碰到了关键字
cursor cemp is select empno,empjob from emp;
pempno emp.empno%type;
pjob emp.empjob%type;
begin
rollback;
--打开光标
open cemp;
loop
fetch cemp into pempno,pjob;
exit when cemp%notfound;
-- 判断员工的职位
if pjob = 'PRESIDENT' then update emp set sal=sal+1000 where empno=pempno;
elsif pjob = 'MANAGER' then update emp set sal=sal+800 where empno=pempno;
else update emp set sal=sal+400 where empno=pempno;
end if;
end loop;
--关闭光标
close cemp;
-- 对于oracle,默认的事务隔离级别是read committed
-- 事务的acid
commit;
dbms_output.put_line('涨工资成功');
end;
/
实例
使用PL/SQL完成员工涨工资。
注意:演示过程中,执行完PL/SQL,查询却没有涨工资,这是因为PL/SQL执行它是一个事物,而查询是一个事物,PL/SQL执行完需要提交事物,否则查询就会发生没有改变。所以一定注意写完PL/SQL程序后,如果修改了数据库中的记录必须要提交事物。这里为了显示刚才增加的工资所以在上面添加rollback,回滚到修改之前的工资。
——总结——
1、oracle数据库默认开启数据库事务。
2、oracle,默认的事物隔离级别是read commited。
记录00001
光标(游标)使用语法:
定义游标
为光标定义对应的变量
在程序体中打开光标
循环体中不断取出新数据
关闭光标
程序执行如果没报错,也没产生效果,原因在于PLSQL程序体有对sql语句操作(对数据进行更改)时,需要在事物中执行;而oracle默认事物级别为read committed,意味着如果没有加上commit 进行提交,将不会产生效果(这里涉及到事物的原子性,隔离性,完整性和一致性),所以在关闭光标后需要提交事物。
提交事物(涉及数据更改时)
如果在写commit之前执行过PLSQL程序一次了,但是数据没发生改变,那么,在加上commit之后,最好在begin 后面加个 rollback,将刚才的执行过的回退掉,防止影响到结果
对于Oracle,默认的事务隔离级别是 read committed
--事务的ACID
原子性、一致性、隔离性、持久性
采用光标给员工涨工资:demo
游标示例:
修改语句之后要提交,使用commit
Oracle,默认的事务隔离级别是不提交,read committed,不提交的话查询是看不到修改的
使用游标(光标)实际例子
事务的四个属性
set serveroutput on declare cursor cemp is select empno,empjob from emp; pempno emp.empno%type; pempjob emp.empjob%type; begin rollback; open cemp; loop fetch cemp into pempno,pempjob; exit when cemp%notfound; if pempjob = 'PRESIDENT' then update emp set sal=sal-2000 where empno=pempno; elsif pempjob = 'MANAGER' then update emp set sal=sal-1600 where empno=pempno; else update emp set sal=sal-800 where empno=pempno; end if; end loop; commit; dbms_output.put_line('涨工资完成'); close cemp; end;
commit;