Oracle基本事务和ForAll执行批量DML练习

基本事务的使用:
从账户一的余额中转100到账户二的余额中去,如果账户二不存在或账户一中的余额不足100则整笔交易回滚


select * from account;
-- 创建一张账户表
create table account(
-- 账户ID
id number(3) not null,
-- 账户名称
name varchar2(50) not null,
-- 账户余额
balance number(8,2) not null,
-- 开启时间
btime date not null
)
-- 插入数据
insert into account(id,name,balance,btime) values(1,'张三',2000.23,to_date('2008-02-12','yyyy-mm-dd'));
insert into account(id,name,balance,btime) values(2,'李四',530,to_date('2008-10-03','yyyy-mm-dd'));
insert into account(id,name,balance,btime) values(3,'王五',1620.2,to_date('2007-08-20','yyyy-mm-dd'));
insert into account(id,name,balance,btime) values(4,'小强',910.9,to_date('2009-01-23','yyyy-mm-dd'));
insert into account(id,name,balance,btime) values(5,'小周',8700,to_date('2006-09-10','yyyy-mm-dd'));

declare
-- 临时保存账户一的余额总数
v_balance account.balance%type;
begin
update account set balance = balance - 100 where name = '&转出账号:' returning balance into v_balance;
if sql%notfound then
raise_application_error(-20001,'转出账号 不存在!');
end if;
if v_balance < 0 then
raise_application_error(-20002,'账户余额不足!');
end if;
update account set balance = balance + 100 where name = '&转入账号:';
if sql%notfound then
raise_application_error(-20003,'转入账号 不存在!');
end if;
commit;
dbms_output.put_line('转账成功!');
exception
when others then rollback;
dbms_output.put_line(sqlerrm);
end;


使用ForAll执行批量DML练习:
账户建立超过6个月的赠送100,超过12个月的赠送200,超过24个月的赠送500,建立时间未过6个月的不赠送

declare
-- 保存建立账户日期与当前日期相差的份数
v_monthbt number(5,2);
type str_table_type is table of varchar2(50) index by binary_integer;
type id_table_type is table of number(3) index by binary_integer;
-- 账户名称数组
name_table str_table_type;
-- 赠送金额数组
money_table str_table_type;
-- 账户ID数组
id_table id_table_type;
begin
for i in 1..5 loop
select months_between(sysdate,btime) into v_monthbt from account where id=i;
if v_monthbt between 6 and 12 then
money_table(i) := 100;
elsif v_monthbt between 12 and 24 then
money_table(i) := 200;
elsif v_monthbt >= 24 then
money_table(i) := 500;
else
money_table(i) := 0;
end if;
id_table(i) := i;
end loop;
-- 使用ForAll批量更新数据
forall i in 1..money_table.count
update account set balance = balance + money_table(i) where id = id_table(i) returning name bulk collect into name_table;
for i in 1..name_table.count loop
dbms_output.put_line(name_table(i));
end loop;
commit;
end;
/

相关推荐
程序员的必经之路! 【限时优惠】 现在下单,还享四重好礼: 1、教学课件免费下载 2、课程案例代码免费下载 3、专属VIP学员群免费答疑 4、下单还送800元编程大礼包 【超实用课程内容】  根据《2019-2020年中国开发者调查报告》显示,超83%的开发者都在使用MySQL数据库。使用量大同时,掌握MySQL早已是运维、DBA的必备技能,甚至部分IT开发岗位也要求对数据库使用和原理有深入的了解和掌握。 学习编程,你可能会犹豫选择 C++ 还是 Java;入门数据科学,你可能会纠结于选择 Python 还是 R;但无论如何, MySQL 都是 IT 从业人员不可或缺的技能!   套餐中一共包含2门MySQL数据库必学的核心课程(共98课时)   课程1:《MySQL数据库从入门到实战应用》   课程2:《高性能MySQL实战课》   【哪些人适合学习这门课程?】  1)平时只接触了语言基础,并未学习任何数据库知识的人;  2)对MySQL掌握程度薄弱的人,课程可以让你更好发挥MySQL最佳性能; 3)想修炼更好的MySQL内功,工作中遇到高并发场景可以游刃有余; 4)被面试官打破沙锅问到底的问题问到怀疑人生的应聘者。 【课程主要讲哪些内容?】 课程一:《MySQL数据库从入门到实战应用》 主要从基础篇,SQL语言篇、MySQL进阶篇三个角度展开讲解,帮助大家更加高效的管理MySQL数据库。 课程二:《高性能MySQL实战课》主要从高可用篇、MySQL8.0新特性篇,性能优化篇,面试篇四个角度展开讲解,帮助大家发挥MySQL的最佳性能的优化方法,掌握如何处理海量业务数据和高并发请求 【你能收获到什么?】  1.基础再提高,针对MySQL核心知识点学透,用对; 2.能力再提高,日常工作中的代码换新貌,不怕问题; 3.面试再加分,巴不得面试官打破沙锅问到底,竞争力MAX。 【课程如何观看?】  1、登录CSDN学院 APP 在我的课程中进行学习; 2、移动端:CSDN 学院APP(注意不是CSDN APP哦)  本课程为录播课,课程永久有效观看时长 【资料开放】 课件、课程案例代码完全开放给你,你可以根据所学知识,自行修改、优化。  下载方式:电脑登录课程观看页面,点击右侧课件,可进行课程资料的打包下载。
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页