`
vipbooks
  • 浏览: 148971 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类

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;
/


分享到:
评论

相关推荐

    Oracle 10g中用FORALL处理非连续数组

    在 Oracle 10g 中,FORALL 语句可以使用 INDICES OF 和 VALUES OF 子句来处理非连续数组。下面我们将详细介绍这两个子句的语法和使用方法。 INDICES OF 子句 INDICES OF 子句用于指定要处理的索引值的范围。它可以...

    Oracle事务与锁定

    Oracle事务与锁定是数据库管理系统中的核心概念,它们对于确保数据的完整性和一致性至关重要。事务是数据库操作的基本单元,它封装了一系列的数据库操作,确保这些操作要么全部成功,要么全部失败,从而保持数据库的...

    Oracle DML触发器的执行顺序.pdf

    Oracle DML 触发器的执行顺序 Oracle 中的 DML 触发器是一种存储在数据库中... Oracle DML 触发器的执行顺序取决于触发器的类型和事件类型。正确地理解和使用 DML 触发器可以帮助我们更好地实现业务规则和数据一致性。

    oracle操作数据-DML语句.pptx

    oracle操作数据-DML语句.pptx

    Oracle_9i培训胶片中文版-1_2.基本的DDL和DML介绍-caith.ppt

    Oracle_9i培训胶片中文版-1_2.基本的DDL和DML介绍-caith.ppt

    记录 集合 BULK COLLECT FORALL 执行计划

    FORALL则是在已经收集了数据的集合上执行DML(数据操纵语言)操作,如INSERT、UPDATE或DELETE,可以一次性处理集合中的多条记录,避免循环中的单条处理。例如: ```sql FORALL i IN quotes.FIRST..quotes.LAST ...

    Oracle DDL,DML,DCL,TCL 基础概念

    ### Oracle DDL、DML、DCL、TCL 基础概念 ...通过以上介绍,我们可以看到 Oracle 数据库中 DDL、DML、DCL 和 TCL 这四种语言的基本概念及其使用方法。掌握这些基础知识对于有效地管理和操作 Oracle 数据库至关重要。

    Oracle SQL(SQL for Oracle)

    8. **事务和并发控制**:Oracle提供了ACID(原子性、一致性、隔离性和持久性)特性,保证了事务的完整性和数据的一致性。同时,通过锁定机制处理多用户并发访问。 9. **触发器**:触发器是一种自动执行的数据库操作...

    oracle事务处理

    * 事务处理执行:执行 DML、DDL、DCL 语句。 * 事务处理结束:事务处理可以通过 COMMIT 或 ROLLBACK 语句来结束。 4. 事务处理的 isolation 级别 事务处理的 isolation 级别可以分为以下几个级别: * 读未提交...

    ORACLE中查找定位表最后DML操作的时间小结

    在Oracle数据库中,如何查找,定位一张表最后一次的DML操作的时间呢? 方式有三种,不过都有一些局限性,下面简单的解析、总结一下。 1:使用ORA_ROWSCN伪列获取表最后的DML时间  ORA_ROWSCN伪列是Oracle 10g开始...

    oracle事务1.ppt

    Oracle事务管理 ...Oracle事务控制是数据库管理系统中最重要的部分之一,它确保了数据库的一致性和可靠性。通过控制事务的开始和结束,控制事务的隔离性,控制事务的原子性,可以确保数据库的可靠性和一致性。

    oracle操作数据DML语句.ppt

    在 Oracle 数据库中,DML 语句是事务的一部分,事务是指一组逻辑操作的集合,用于确保数据库中的数据的一致性和完整性。 Oracle 操作数据 DML 语句的主要优点是可以高效地操作数据库中的数据,提高数据的可靠性和...

    oracle 数据操作与事务控制

    在本章中,我们将深入探讨Oracle的数据操作语言(DML)和事务控制机制。 首先,数据操作语言(DML)包括INSERT、UPDATE、DELETE和MERGE四种基本语句。INSERT语句用于向表中插入新的记录,例如,插入一个新部门的...

    oracle事务与死锁

    本文将详细介绍Oracle数据库中事务的概念、操作、控制以及死锁的原理和处理方法,但不涉及具体的Java设计模型或代码样例,仅以Oracle事务和死锁为主题进行讨论。 ### 事务概念 在Oracle中,事务是确保数据库数据...

    oracle数据库基础练习题

    4. **DML操作**:插入(INSERT)、更新(UPDATE)、删除(DELETE)数据的基本语法,以及事务(TRANSACTION)的管理,包括COMMIT、ROLLBACK和SAVEPOINT。 5. **PL/SQL编程**:学习编写PL/SQL块,包括BEGIN-END结构,...

    数据库查询语言(DML)的练习

    大量的SQL语句的练习与答案。适用于需对DML(数据库控制语言)快速掌握的童鞋

Global site tag (gtag.js) - Google Analytics