热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

Oracle数据操作和控制语言详解(之一)

wanwentao.blog.51cto.com2406488457598SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL。其中用于定义数据的结构,比如创建、修改或者删除数据库;DCL用于定义数据库用户的权限;在这篇文章中我将

http://wanwentao.blog.51cto.com/2406488/457598 SQL 语言共分为四大类:数据查询语言DQL,数据操纵语言DML, 数据定义语言DDL,数据控制语言DCL。其中用于定义数据的结构,比如 创建、修改或者删除数据库;DCL用于定义数据库用户的权限;在这篇文章中我将

http://wanwentao.blog.51cto.com/2406488/457598


SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML, 数据定义语言DDL,数据控制语言DCL。其中用于定义数据的结构,比如 创建、修改或者删除数据库;DCL用于定义数据库用户的权限;在这篇文章中我将详细讲述这两种语言在Oracle中的使用方法。

  DML语言


  DML是SQL的一个子集,主要用于修改数据,下表列出了ORACLE支持的DML语句。

语句

用途

INSERT

向表中添加行

UPDATE

更新存储在表中的数据

DELETE

删除行

SELECT FOR UPDATE

禁止其他用户访问DML语句正在处理的行。

LOCK TABLE

禁止其他用户在表中使用DML语句

  插入数据
  INSERT语句常常用于向表中插入行,行中可以有特殊数据字段,或者可以用子查询从已存在的数据中建立新行。
  列目录是可选的,缺省的列的目录是所有的列名,包括comlumn_id,comlumn_id可以在数据字典视图ALL_TAB_COLUMNS,USER_TAB_COLUMNS,或者DBA_TAB_COLUMNS中找到。
  插入行的数据的数量和数据类型必须和列的数量和数据类型相匹配。不符合列定义的数据类型将对插入值实行隐式数据转换。NULL字符串将一个NULL值插入适当的列中。关键字NULL常常用于表示将某列定义为NULL值。
  下面的两个例子是等价的。

INSERT INTO customers(cust_id,state,post_code)
VALUE('Ariel',NULL,'94501');

  或
INSERT INTO customers(cust_id,state,post_code)
VALUE('Ariel',,'94501');

  更新数据
  UPDATE命令用于修改表中的数据。
UPDATE order_rollup
SET(qty,price)=(SELECT SUM(qty),SUM(price) FROM order_lines WHERE customer_id='KOHL'
WHERE cust_id='KOHL'
AND order_period=TO_DATE('01-Oct-2000')

  删除数据
  DELETE语句用来从表中删除一行或多行数据,该命令包含两个语句:
   1、关键字DELETE FROM后跟准备从中删除数据的表名。
   2、WHERE后跟删除条件
DELETE FROM po_lines
WHERE ship_to_state IN ('TX','NY','IL')
AND order_date

  清空表
  如果你想删除表中所有数据,清空表,可以考虑使用DDL语言的TRUNCATE语句。TRUNCATE就像没有WHERE子句的DELETE命令一样。TRUNCATE将删除表中所有行。TRUNCATE不是DML语句是DDL语句,他和DELETE右不同的特点。
TRUNCATE TABLE (schema)table DROP(REUSE) STORAGE
  STORAGE子串是可选的,缺省是DROP STORAGE。当使用DROP STORAGE时将缩短表和表索引,将表收缩到最小范围,并重新设置NEXT参数。REUSE STORAGE不会缩短表或者调整NEXT参数。
  TRUNCATE和DELETE有以下几点区别
  1、TRUNCATE在各种表上无论是大的还是小的都非常快。如果有ROLLBACK命令DELETE将被撤销,而TRUNCATE则不会被撤销。
  2、TRUNCATE是一个DDL语言,向其他所有的DDL语言一样,他将被隐式提交,不能对TRUNCATE使用ROLLBACK命令。
  3、TRUNCATE将重新设置高水平线和所有的索引。在对整个表和索引进行完全浏览时,经过TRUNCATE操作后的表比DELETE操作后的表要快得多。
  4、TRUNCATE不能触发任何DELETE触发器。
  5、不能授予任何人清空他人的表的权限。
  6、当表被清空后表和表的索引讲重新设置成初始大小,而delete则不能。
  7、不能清空父表。
  SELECT FOR UPDATE
  select for update语句用于锁定行,阻止其他用户在该行上修改数据。当该行被锁定后其他用户可以用SELECT语句查询该行的数据,但不能修改或锁定该行。
  锁定表
  LOCK语句常常用于锁定整个表。当表被锁定后,大多数DML语言不能在该表上使用。LOCK语法如下:
LOCK schema table IN lock_mode
  其中lock_mode有两个选项:
   share 共享方式
   exclusive 唯一方式
  例:
LOCK TABLE intentory IN EXCLUSIVE MODE
  死锁
  当两个事务都被锁定,并且互相都在等待另一个被解锁,这种情况称为死锁。
  当出现死锁时,ORACLE将检测死锁条件,并返回一个异常。

事务控制
  事务控制包括协调对相同数据的多个同步的访问。当一个用户改变了另一个用户正在使用的数据时,oracle使用事务控制谁可以操作数据。
  事务
  事务表示工作的一个基本单元,是一系列作为一个单元被成功或不成功操作的SQL语句。在SQL和PL/SQL中有很多语句让程序员控制事务。程序员可以:
   1、显式开始一个事物,选择语句级一致性或事务级一致性
   2、设置撤销回滚点,并回滚到回滚点
   3、完成事务永远改变数据或者放弃修改。
  事务控制语句

语句

用途

Commit

完成事务,数据修改成功并对其他用户开放

Rollback

撤销事务,撤销所有操作

rollback to savepoint

撤销在设置的回滚点以后的操作

set transaction

响应事务或语句的一致性;特别对于事务使用回滚段

  例:
BEGIN
UPDATE checking
SET balance=balance-5000
WHERE account='Kieesha';

INSERT INTO checking_log(action_date,action,amount)
VALUES (SYSDATE,'Transfer to brokerage',-5000);

UPDATE brokerage
SET cash_balance=cash_balance+5000
WHERE account='Kiesha';

INSERT INTO brokerage_log(action_date,action,amount)
VALUES (SYSDATE,'Tracfer from checking',5000)

COMMIT

EXCEPTION
WHEN OTHERS
ROLLBACK
END

  Savepoint 和 部分回滚(Partial Rollback)
  在SQL和PL/SQL中Savepoint是在一事务范围内的中间标志。经常用于将一个长的事务划分为小的部分。保留点Savepoint可标志长事务中的任何点,允许可回滚该点之后的操作。在应用程序中经常使用Savepoint;例如一过程包含几个函数,在每个函数前可建立一个保留点,如果函数失败,很容易返回到每一个函数开始的情况。在回滚到一个Savepoint之后,该Savepoint之后所获得的数据封锁被释放。为了实现部分回滚可以用带TO Savepoint子句的ROLLBACK语句将事务回滚到指定的位置。
  例
BEGIN
INSERT INTO ATM_LOG(who,when,what,where)
VALUES ('Kiesha',SYSDATE,'Withdrawal of $100','ATM54')
SAVEPOINT ATM_LOGGED;

UPDATE checking
SET balance=balance-100
RETURN balance INTO new_balance;

IF new_balance<0
THEN
ROLLBACK TO ATM_LOGGED;
COMMIT
RAISE insufficient_funda;
END IF

END
  关键字SAVEPOINT是可选的,所以下面两个语句是等价的:
ROLLBACK TO ATM_LOGGED;
ROLLBACK TO SAVEPOINT ATM_LOGGED;

  一致性和事务
  一致性是事物控制的关键慨念。掌握了oracle 的一致性模型,能使您更好的,更恰当的使用事务控制。oracle通过一致性保证数据只有在事务全部完成后才能被用户看见和使用。这项技术对多用户数据库有巨大的作用。
  oracle常常使用语句级(state-level)一致性,保证数据在语句的生命期之间是可见的但不能被改变。事务由多个语句组成,当使用事务时,事物级(transaction-level)一致性在整个事务生命期中保证数据对所有语句都是可见的。

  oracle通过SCN(syatem change number)实施一致性。一个SCN是一个面向时间的数据库内部键。SCN只会增加不会减少,SCN表示了时间上的一个点,每个数据块都有一个SCN,通过比较这个点实施操作。

  事务级一致性

  SET TRANSACTION 的一个作用是确保事务级一致或语句级一致中有一个实施。ORACLE使用这些术语:

   ISOLATION LEVEL READ COMMIT 表示语句级一致

   ISOLATION LEVEL SERIALIZABLE 表示事务级一致。

  例:

SET TRANSACTION ISOLATION LEVEL READ COMMIT;

SET TRANSACTION ISOLATION LEVEL READ COMMIT

  下面的语句也能确保事务级一致:

SET TRANSCATION READ ONLY
  任何企图在只读(READ ONLY)事务中修改数据的操作都会抛出一个异常。但是,READ ONLY事务只能在下列语句中使用:

SELECT(没有FOR UPDATE子句)
LOCK TABLE
SET ROLE
ALTER SYSTEM
ALTER ALARM

  即使没有改变任何数据,READ ONLY事务依然必须使用一个COMMIT或ROLLBACK以结束整个事务。

  SET TRANSCTION的另外一个应用是在回滚时直接使用回滚段(ROLLBACK SEGMENT)。回滚段是ORACLE的一个特殊的数据对象,回滚段的头部包含正在使用该回滚段事务的信息。当用户回滚事务(ROLLBACK)时,ORACLE将会利用回滚段中的数据前影像来将修改的数据恢复到原来的&#20540;。oracle用round-robin给事务随机分配回滚段。一个大的事务可以分配任何回滚段,这也许会导致回滚段的大小变得很大。因此要避免让大的事务随机分配回滚段。

  事务以SET TRANSACTION开始,象下面这样:

SET TRANSACTION USE ROLLBACK SEGMENT rb_large;
  rb_large是一个大的回滚段的名称,现在就给一个大的事务分配了一个大的回滚段,其他的小的回滚段将不由动态空间管理,这样就更有效率。

  下面我们看一个例子.我们有一个回滚段表空间大小是2G,在高峰时期需要10个回滚段以满足用户的需要,这些高峰在线用户只有小的事务。一周我们连续运行了4个大的事务,这些事务需要删除和加载数据,每一个撤销需要1G,回滚段的大小如下:

rb_large(initial 100M minextenta 2)

rb1 (initial 1M next minextents 5)
rb2 (initial 1M next minextents 5)
rb3 (initial 1M next minextents 5)
rb4 (initial 1M next minextents 5)
rb5 (initial 1M next minextents 5)
rb6 (initial 1M next minextents 5)
rb7 (initial 1M next minextents 5)
rb8 (initial 1M next minextents 5)
rb9 (initial 1M next minextents 5)
rb10 (initial 1M next minextents 5)

  所有的都非常恰当的安排在2G的表空间中,如果我们缺省的round-robin给事务分配回滚段,4个大事务将有4个独立的回滚段,每个回滚段的大小将是1G,如果这样我们的2G表空间就不够,而数据库管理员就不得不在夜晚2点起来工作,每个事务都由以下面的语句开始:

SET TRANSACTION USE ROLLBACK SEGMENT rb_large
  现在 4个事务重用相同的表空间,保正4个回滚段的表空间在2G以内。数据库管理员可以睡到天亮。

推荐阅读
  • 利用存储过程构建年度日历表的详细指南
    本文将介绍如何使用SQL存储过程创建一个完整的年度日历表。通过实例演示,帮助读者掌握存储过程的应用技巧,并提供详细的代码解析和执行步骤。 ... [详细]
  • SQLite 动态创建多个表的需求在网络上有不少讨论,但很少有详细的解决方案。本文将介绍如何在 Qt 环境中使用 QString 类轻松实现 SQLite 表的动态创建,并提供详细的步骤和示例代码。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 理解存储器的层次结构有助于程序员优化程序性能,通过合理安排数据在不同层级的存储位置,提升CPU的数据访问速度。本文详细探讨了静态随机访问存储器(SRAM)和动态随机访问存储器(DRAM)的工作原理及其应用场景,并介绍了存储器模块中的数据存取过程及局部性原理。 ... [详细]
  • 自学编程与计算机专业背景者的差异分析
    本文探讨了自学编程者和计算机专业毕业生在技能、知识结构及职业发展上的不同之处,结合实际案例分析两者的优势与劣势。 ... [详细]
  • 阅读本文大约需要3分钟。微信8.0版本的发布带来了许多令人振奋的新功能,如烟花特效和改进的悬浮窗,引发了用户的热烈反响。 ... [详细]
  • 深入理解Java泛型:JDK 5的新特性
    本文详细介绍了Java泛型的概念及其在JDK 5中的应用,通过具体代码示例解释了泛型的引入、作用和优势。同时,探讨了泛型类、泛型方法和泛型接口的实现,并深入讲解了通配符的使用。 ... [详细]
  • 作为一名程序员,从大学步入职场后,常常感受到一种难以言喻的空虚感。这种感觉或许源于对生活的不满、职业发展的瓶颈,或是日常琐事带来的压力。本文将深入探讨这种复杂的情感,并尝试寻找解决之道。 ... [详细]
  • 深入解析:阿里实战 SpringCloud 微服务架构与应用
    本文将详细介绍 SpringCloud 在微服务架构中的应用,涵盖入门、实战和案例分析。通过丰富的代码示例和实际项目经验,帮助读者全面掌握 SpringCloud 的核心技术和最佳实践。 ... [详细]
  • 并发编程:深入理解设计原理与优化
    本文探讨了并发编程中的关键设计原则,特别是Java内存模型(JMM)的happens-before规则及其对多线程编程的影响。文章详细介绍了DCL双重检查锁定模式的问题及解决方案,并总结了不同处理器和内存模型之间的关系,旨在为程序员提供更深入的理解和最佳实践。 ... [详细]
  • 本文深入探讨了C++对象模型中的一些细节问题,特别是虚拟继承和析构函数的处理。通过具体代码示例和详细分析,揭示了书中某些观点的不足之处,并提供了更合理的解释。 ... [详细]
  • 随着网络安全威胁的不断演变,电子邮件系统成为攻击者频繁利用的目标。本文详细探讨了电子邮件系统中的常见漏洞及其潜在风险,并提供了专业的防护建议。 ... [详细]
  • 微软Exchange服务器遭遇2022年版“千年虫”漏洞
    微软Exchange服务器在新年伊始遭遇了一个类似于‘千年虫’的日期处理漏洞,导致邮件传输受阻。该问题主要影响配置了FIP-FS恶意软件引擎的Exchange 2016和2019版本。 ... [详细]
author-avatar
慧萍书群415
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有