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

Oracle学习笔记(4) 在PLSQL中更改数据和管理事务

阅读更多
   这是第四章的学习笔记,学习完第三章的程序控制之后,开始要学习数据更改、集合遍历和事务管理了……,希望大家能多给俺一些支持啊!
    编程时使用的工具是PLSQL Developer 7.1.4

每次执行一个SQL DML语句(insert、update或delete)以及返回单选select into时,
PL/SQL都会声明和管理一个隐式游标
隐式游标的相关属性(不能用dbms_output输出):
sql%found:记录成功获取返回True,否则返回False
sql%notfound:记录获取失败返回True,否则返回False
sql%rowcount:返回已经从游标中获取的记录数
sql%isopen:判断游标是否打开,语句执行完游标就会关闭,所以一般总是返回False
如果会话中还没有隐式游标被执行,那么所有的隐式游标属性都返回NULL,如果有游标
执行了,那么不管SQL语句是在块还是子程序中执行的,属性的值总是指向最近执行的SQL语句

declare
  n_empno employee.empno%type;
  v_name employee.name%type;
  n_salary employee.salary%type;
  type a_name is varray(100) of varchar2(20);
  type a_salary is varray(100) of number(10,2);
  n_names a_name := a_name('李明','赵林','晓月','钱勇');
  n_salaries a_salary;
begin
  -- 判断Update语句是否执行成功并返回影响的行数
  update employee set salary=4000 where empno=2;
  if sql%found then
     dbms_output.put_line('Update语句执行成功!');
     dbms_output.put_line('Update语句影响的行数是:' || sql%rowcount);
  else
     dbms_output.put_line('Update语句执行失败!');
     dbms_output.put_line('Update语句影响的行数是:' || sql%rowcount);
  end if;
  -- 可以在insert、update或delete这三条语句之后加上Returning子句,将这三条语句执行之后的信息返回给变量
  n_empno := &输入要加薪员工的编号:;
  select name into v_name from employee where empno = n_empno;
  update employee set salary = salary + 500 where empno = n_empno returning salary into n_salary;
  if sql%found then
     dbms_output.put_line(v_name || '加薪500元,他加薪后的工资是:' || n_salary);
  else
     dbms_output.put_line(v_name || '加薪失败!');
  end if;

如果DML语句改变了多行,可以用returning ... bulk collect into val_collection 获得改变多行的信息
Forall 语句后面必须且只能接一个SQL DML语句,它没有Loop和end结束语句
Forall语句只适用于执行批量的insert、update或delete的SQL DML语句
Forall语句中使用的I变量不能直接用在SQL语句的Where条件中,只能把I变量放在集合中使用
而bulk collect子句用于取得批量数据,该子句只能用于Select、Fetch
和insert、update或delete的SQL DML语句的Returning子句中
用于forall 语句的隐式游标的相关属性:
除了支持SQL DML语句的隐式游标属性外还包括其特有的属性:
sql%bulk_rowcount:返回一个集合,来告诉我们通过Forall执行的每个相关SQL语句处理的行数,当%bulk_rowcount(i)为零时,
%found和%notfound分别为false和true
sql%bulk_exception:返回Forall中每DML操作可能抛出的异常信息
  -- 遍历集合的方法一
  forall i in n_names.first..n_names.last
     update employee set salary = salary + 500 where name = n_names(i) returning salary bulk collect into n_salaries;
     dbms_output.put_line('第1个元素更新的行数为:' || sql%bulk_rowcount(1));
  -- 遍历集合的方法二
  for i in 1..n_salaries.count loop
    dbms_output.put_line(n_salaries(i));
  end loop;

事务管理:
管理事务的语句:
Commit:提交改变并释放锁定资源
Rollback:回滚所有的改变并释放锁定资源
SavePoint:设置一个保存点
Rollback to SavePoint:回滚到指定的保存点并释放保存点范围内的锁定资源
Set Transaction:建立隔离级别或分配当前的事务到一个指定的回滚段
设置只读或可读写事务的语法是:
set transaction [read only | read write]
设置一个事务的级别:
set transaction isolation level <isolation level name>
注意:set transaction 必须出现在一个事务的第一条且只能出现一次
set transaction 仅影响当前事务
Lock Table:允许我们使用指定的模式锁住整个数据库表,它将覆盖默认的行级锁
  -- 事务开始
  insert into Employee values(EmpSeq.Nextval,'江忠','一厂厂长',0,'2006-10-21',4200,'生产',5);
  -- 设置保存点
  savepoint one;
  insert into Employee values(EmpSeq.Nextval,'赵林','后勤主任',0,'2008-01-05',3500,'后勤',2);
  insert into Employee values(EmpSeq.Nextval,'晓月','财务经理',1,'2007-11-16',6800,'财务',3);
  insert into Employee values(EmpSeq.Nextval,'钱勇','销售经理',1,'2009-01-09',5300,'销售',4);
  -- 回滚到指定的保存点
  rollback to savepoint one; 
  -- 回滚所有的改变
  rollback;  
  -- 提交时可以附加注释信息(当执行DDL、DCL语句和退出SQL*Plus时会自动提交事务)
  commit comment '修改员工信息';
  -- 所有事务结束
  /*
	四种事务隔离级别:
	未提交读、提交读、可重复读、可串行读 
   */
exception
   when NO_DATA_FOUND then dbms_output.put_line('查询不到员工编号为' || n_empno || '的员工!');
   when TOO_MANY_ROWS then dbms_output.put_line('数据完整性错误,员工编号' || n_empno || '重复!');
   when OTHERS then dbms_output.put_line('PL/SQL执行错误!' || sqlerrm);
end;
/
分享到:
评论

相关推荐

    精通oracle 10g plsql 编程-学习笔记

    ### 精通Oracle 10g PL/SQL编程学习笔记 #### 一、PL/SQL综述 **1.1 PL/SQL的功能与作用** PL/SQL (Procedural Language for SQL) 是一种专门为Oracle数据库设计的过程化语言,它结合了SQL的数据处理能力与过程化...

    PLSQL学习笔记

    在本篇"PLSQL学习笔记"中,我们将深入探讨这一强大的数据库编程工具,主要涵盖以下几个核心知识点: 一、PL/SQL简介 1.1 什么是PL/SQL PL/SQL是Procedural Language/SQL的缩写,由Oracle公司开发,它扩展了SQL的...

    Oracle9i PLSQL 入门到精通读书笔记

    Oracle9i PLSQL是Oracle数据库系统中的编程语言,用于创建和管理数据库对象,以及执行复杂的数据库操作。PL/SQL(Procedural Language/Structured Query Language)结合了SQL的查询功能和过程性编程语言的特性,使得...

    oracle学习笔记

    Oracle学习笔记是一个面向初学者的资源集合,旨在帮助读者快速入门Oracle数据库系统。Oracle是全球广泛使用的大型关系型数据库管理系统之一,尤其在企业级应用中占据重要地位。这份笔记涵盖了Oracle的基础知识,对于...

    韩顺平oracle视频笔记

    - **概念**:在Oracle数据库中,用户是用来管理访问权限的基本单位。每个用户都可以有自己的模式(schema),其中包含各种对象如表、视图等。 - **创建用户**:通过`CREATE USER username IDENTIFIED BY password;`来...

    oracle经典笔记

    Oracle是世界上最广泛使用的数据库管理系统之一,它以其强大的数据管理能力和高度可扩展性而著称。在"Oracle经典笔记"中,我们可以通过四个文档深入学习Oracle的相关知识,包括SQL语句、SQL语法练习、PL/SQL基础教程...

    plsql学习文件

    通过这份"PLSQL笔记",初学者可以系统地了解和掌握PL/SQL的基本概念、语法和实践技巧,进一步提升在数据库管理领域的专业技能。在实际学习过程中,结合实例进行练习,将理论知识与实际操作相结合,能更有效地巩固和...

    oracle 资料收集

    这篇学习笔记将深入探讨Oracle的体系结构、关键组件以及DBA、RMAN和PLSQL等相关技术。 一、Oracle体系结构 Oracle数据库的核心是Oracle Server,它负责处理用户请求,管理数据存储,并确保数据的安全性和完整性。...

    数据库笔记

    在RDBMS中,数据被组织成一系列的表格,每个表格都有一个唯一的名字,包含列和行。列定义了表中的字段类型,而行则代表了一条记录或数据实例。 ### Oracle数据库 Oracle数据库是甲骨文公司开发的一款流行的关系型...

    PL/SQL文本文档

    PL/SQL,全称为Procedural Language/Structured Query Language,是Oracle...如果你对“PLSQL”标签下的笔记内容感兴趣,可以深入研究这两个文档——"PLSQL"和"PLSQL2",它们可能包含了更具体的操作示例和实践经验。

    sql-oracle-bhcc:BHCC学生-CIT 236-SQL编程-SPRING2020

    【标签】"sql-oracle PLSQL" 指出这个课程不仅涵盖SQL基础,还涉及Oracle数据库的高级特性,特别是PL/SQL,这是一种在Oracle数据库中用于编写存储过程、函数和触发器的编程语言。 【压缩包子文件的文件名称列表】...

    PL/SQL听课笔记

    4. **集成能力**:能够与SQL语句无缝集成,使得开发者能够在单一环境中处理复杂的业务逻辑和数据操作。 #### 二、PL/SQL的优点 1. **提升系统的性能**:通过批量处理SQL语句,减少了与数据库之间的交互次数,显著...

Global site tag (gtag.js) - Google Analytics