事务与序列实现的自增id
1. 创建序列:
create sequence seq_add
minvalue 8000
2. 创建触发器:
createorreplacetrigger trigger_seq
beforeinserton scott.emp
foreachrow
begin
--使用序列添加id到更新的一行
select seq_add.nextvalinto :new.empno from dual;
end;
3. 添加数据:insertinto scott.emp(ename)values('zxxxx')
4. 查询:select * from scott.emp
Ø 事务
² 事务的四大特性
原子性
一致性
隔离性
持久性
特点:要么就是全部执行成功,要么就是全部不执行
保存点
Savapoint 保存点名称
savepointa;
恢复到保存点
Rollback to 保存点名称
事务转账
createorreplaceprocedureproc_sal(pmoneyint)
as
begin
--转出
update scott.empsetsal=sal-pmoneywhere empno=7839;
--转入
update scott.empsetsal=sal+pmoneywhere empno=7788;
--提交(这样直接提交很危险)
commit;
end;
--调用
begin
proc_sal(1000);
end;
异常处理
createorreplaceprocedure proc_sal(pmoneyint,pinp nvarchar2,poutpnvarchar2)
as
numerror int:=0;
begin
--转出
updatescott.empset sal=sal-pmoneywhere ename=pinp;
--错误号
numerror:=numerror+sql%rowcount;
--转入
updatescott.empset sal=sal+pmoneywhere ename=poutp;
--错误号
numerror:=numerror+sql%rowcount;
ifnumerror<2then
dbms_output.put_line('转账失败');
--回滚
rollback;
else
--提交(这样直接提交很危险)
commit;
endif;
end;
² 事务异常处理
createorreplaceprocedure proc_sal(pmoneyint,pinp nvarchar2,poutpnvarchar2)
as
numerror int:=0;
begin
--转出
updatescott.empset sal=sal-pmoneywhere ename=pinp;
--错误号
numerror:=numerror+sql%rowcount;
--转入
updatescott.empset sal=sal+pmoneywhere ename=poutp;
--错误号
numerror:=numerror+sql%rowcount;
ifnumerror<2then
dbms_output.put_line('转账失败');
rollback;
else
--提交(这样直接提交很危险)
commit;
endif;
exception--异常处理
whenothersthen
begin
dbms_output.put_line('转账过程中出现异常');
rollback;--回滚
end;
end;