随笔-25  评论-13  文章-1  trackbacks-0
  2011年12月31日

1.解释冷备份和热备份的不同点以及各自的优点
解答:热备份针对归档模式的数据库,在数据库仍旧处于工作状态时进行备份。而冷备份指在数据库关闭后,进行备份,适用于所有模式的数据库。热备份的优点在于当备份时,数据库仍旧可以被使用并且可以将数据库恢复到任意一个时间点。冷备份的优点在于它的备份和恢复操作相当简单,并且由于冷备份的数据库可以工作在非归档模式下,数据库性能会比归档模式稍好。(因为不必将archive log写入硬盘)
2.你必须利用备份恢复数据库,但是你没有控制文件,该如何解决问题呢?
解答:重建控制文件,用带backup control file 子句的recover 命令恢复数据库。
3.如何转换init.ora到spfile?
解答:使用create spfile from pfile 命令.
4.解释data block , extent 和 segment的区别(这里建议用英文术语)
解答:data block是数据库中最小的逻辑存储单元。当数据库的对象需要更多的物理存储空间时,连续的data block就组成了extent . 一个数据库对象拥有的所有extents被称为该对象的segment.
5.给出两个检查表结构的方法
解答:1.DESCRIBE命令
2.DBMS_METADATA.GET_DDL 包
6.怎样查看数据库引擎的报错
解答:alert log.
评价:这里的回答并不是十分全面,这些问题可以通过多个角度来进行解释,也许你不必在面试过程中给出完全详尽的答案,只需要通过你的解答使面试考官了解你对ORACLE概念的熟悉程度。

posted @ 2011-12-31 11:37 Ronger 阅读(9) 评论(0) 编辑
  2011年12月29日


  这篇文章主要介绍RMAN的常用方法,其中包含了作者一些自己的经验,里面的实验也基本全在WIN 2K和ORACLE 8.1.6环境下测试成功(因为这个环境比较容易实现)。
  
  本文借鉴了网上一些高手的相关文章,希望大侠们不要见怪,此处一并谢过。
  
  因为篇幅有限,一些技术细节不能一一覆盖了,只希望能够帮助新手入门的作用,想真正熟练掌握RMAN,必须经过较长时间的实践磨练才可以,尤其需要在工程中获得宝贵的故障解决经验。
  
  1.什么是RMAN?
  RMAN可以用来备份和还原数据库文件、归档日志和控制文件。它也可以用来执行完全或不完全的数据库恢复。
  
  注意:RMAN不能用于备份初始化参数文件和口令文件。
  
  RMAN启动数据库上的Oracle服务器进程来进行备份或还原。备份、还原、恢复是由这些进程驱动的。
  
  RMAN可以由OEM的Backup Manager GUI来控制,但在本文章里不作重点讨论。
  
  2. Terminology 专业词汇解释
  2.1. Backup sets 备份集合
  
  备份集合有下面的特性:
  
  包括一个或多个数据文件或归档日志
  
  以oracle专有的格式保存
  
  有一个完全的所有的备份片集合构成
  
  构成一个完全备份或增量备份
  
  2.2. Backup pieces 备份片
  
  一个备份集由若干个备份片组成。每个备份片是一个单独的输出文件。一个备份片的大小是有限制的;如果没有大小的限制, 备份集就只由一个备份片构成。备份片的大小不能大于使用的文件系统所支持的文件长度的最大值。
  
  2.3. Image copies 镜像备份
  
  镜像备份是独立文件(数据文件、归档日志、控制文件)的备份。它很类似操作系统级的文件备份。它不是备份集或 备份片,也没有被压缩。
  
  2.4. Full backup sets 全备份集合
  
  全备份是一个或多个数据文件中使用过的数据块的的备份。没有使用过的数据块是不被备份的,也就是说,oracle 进行备份集合的压缩。
  
  2.5. Incremental backup sets 增量备份集合
  
  增量备份是指备份一个或多个数据文件的自从上一次同一级别的或更低级别的备份以来被修改过的数据块。 与完全备份相同,增量备份也进行压缩。
  
  2.6. File multiplexing
  
  不同的多个数据文件的数据块可以混合备份在一个备份集中。
  
  2.7. Recovery catalog resyncing 恢复目录同步
  
  使用恢复管理器执行backup、copy、restore或者switch命令时,恢复目录自动进行更新,但是有关日志与归档日志信息没有自动记入恢复目录。需要进行目录同步。使用resync catalog命令进行同步。
  
  RMAN>resync catalog;
  RMAN-03022:正在编译命令:resync
  RMAN-03023:正在执行命令:resync
  RMAN-08002:正在启动全部恢复目录的 resync
  RMAN-08004:完成全部 resync
  
  3. 恢复目录
  3.1.恢复目录的概念
  
  恢复目录是由RMAN使用、维护的用来放置备份信息的仓库。RMAN利用恢复目录记载的信息去判断如何执行需要的备份恢复操作。
  
  恢复目录可以存在于ORACLE数据库的计划中。
  
  虽然恢复目录可以用来备份多个数据库,建议为恢复目录数据库创建一个单独的数据库。
  
  恢复目录数据库不能使用恢复目录备份自身。
  
  3.2.建立恢复目录
  
  第一步,在目录数据库中创建恢复目录所用表空间:
  
  SQL> create tablespace rman_ts datafile 'd:\oracle\oradata\rman\rman_ts.dbf' size 20M;
  
  表空间已创建。
  
  第二步,在目录数据库中创建RMAN 用户并授权:
  
  SQL> create user rman identified by rman default tablespace rman_ts temporary tablespace temp quota unlimited on rman_ts;
  
  用户已创建。
  
  SQL> grant recovery_catalog_owner to rman ;
  
  授权成功。
  SQL> grant connect, resource to rman ;
  
  授权成功。
  
  第三步,在目录数据库中创建恢复目录
  
  C:\>rman catalog rman/rman
  
  恢复管理器:版本8.1.6.0.0 - Production
  
  RMAN-06008:连接到恢复目录数据库
  RMAN-06428:未安装恢复目录
  RMAN>create catalog tablespace rman_ts;
  RMAN-06431:恢复目录已创建
  
  注意:虽然使用RMAN不一定必需恢复目录,但是推荐使用。因为恢复目录记载的信息大部分可以通过控制文件来记载,RMAN在恢复数据库时使用这些信息。不使用恢复目录将会对备份恢复操作有限制。
  
  3.3.使用恢复目录的优势
  
  可以存储脚本;
  
  记载较长时间的备份恢复操作;
  
  4. 启动RMAN
  RMAN为交互式命令行处理界面,也可以从企业管理器中运行。
  
  为了使用下面的实例,先检查环境符合:
  
  the target database is called "his" and has the same TNS alias
  
  user rman has been granted "recovery_catalog_owner "privileges
  
  目标数据库的连接用户为internal帐号,或者以其他SYSDBA类型帐号连接
  
  the recovery catalog database is called "rman" and has the same TNS alias
  
  the schema containing the recovery catalog is "rman" (same password)
  
  在使用RMAN前,设置NLS_DATE_FORMAT 和NLS_LANG环境变量,很多RMAN LIST命令的输出结果是与日期时间相关的,这点在用户希望执行以时间为基准的恢复工作也很重要。
  
  下例是环境变量的示范:
  
  NLS_LANG= SIMPLIFIED CHINESE_CHINA.ZHS16GBK
  NLS_DATE_FORMAT=DD-MON-YYYY HH24:MI:SS
  
  为了保证RMAN使用时能连接恢复目录,恢复目录数据库必须打开,目标数据库至少要STARTED(unmount),否则RMAN会返回一个错误,目标数据库必须置于归档模式下。
  
  4.1.使用不带恢复目录的RMAN
  
  设置目标数据库的 ORACLE_SID ,执行:
  
  % rman nocatalog
  RMAN> connect target
  RMAN> connect target internal/@his
  
  4.2.使用带恢复目录的RMAN
  
  % rman rman_ts rman/rman@rman
  RMAN> connect target
  % rman rman_ts rman/rman@rman target internal/@his
  
  4.3.使用RMAN
  
  一旦连接到目标数据库,可以通过交互界面或者事先存储的脚本执行指定RMAN命令, 下面是一个使用RMAN交互界面的实例:
  
  RMAN> resync catalog;
  RMAN-03022:正在编译命令:resync
  RMAN-03023:正在执行命令:resync
  RMAN-08002:正在启动全部恢复目录的 resync
  RMAN-08004:完成全部 resync
  
  使用脚本的实例:
  
  RMAN> execute script alloc_1_disk;
  
  创建或者替代存储的脚本:
  
  RMAN> replace script alloc_1_disk {
  2> allocate channel d1 type disk;
  3> }
  
  5.注册或者注销目标数据库
  5.1.注册目标数据库
  
  数据库状态:
  
  恢复目录状态:打开
  
  目标数据库:加载或者打开
  
  目标数据库在第一次使用RMAN之前必须在恢复目录中注册:
  
  第一步,启动恢复管理器,并且连接目标数据库:
  
  C:\>rman target internal/oracle@his catalog rman/rman@rman
  
  恢复管理器:版本8.1.6.0.0 - Production
  
  RMAN-06005:连接到目标数据库:HIS (DBID=3021445076)
  RMAN-06008:连接到恢复目录数据库
  
  第二步,注册数据库:
  
  RMAN> register database;
  RMAN-03022:正在编译命令:register
  RMAN-03023:正在执行命令:register
  RMAN-08006:注册在恢复目录中的数据库
  RMAN-03023:正在执行命令:full resync
  RMAN-08002:正在启动全部恢复目录的resync
  RMAN-08004:完成全部resync
  
  5.2.注销目标数据库
  
  RMAN提供了一个注销工具,叫DBMS_RCVCAT工具包,请注意一旦注销了该目标数据库,就不可以使用恢复目录中含有的备份集来恢复数据库了。
  
  为了能注销数据库,需要获得数据库的标识码(DB_ID)和数据库键值(DB_KEY)。其中连接目标数据库时将会获得DB_ID。
  
  C:\>rman target internal/oracle@his catalog rman/rman@rman
  
  恢复管理器:版本8.1.6.0.0 - Production
  
  RMAN-06005:连接到目标数据库:HIS (DBID=3021445076)
  RMAN-06008:连接到恢复目录数据库
  
  其中DBID=3021445076,利用DBID=3021445076查询数据库键值码:
  
  连接到目标数据库,查询db表:
  
  SQL> select * from db;
  
  DB_KEY DB_ID CURR_DBINC_KEY
  ---------- ---------- --------------
  1 3021445076 2
  
  获得DB_KEY=1,这样,该目标数据库DB_KEY=1,DBID=3021445076,利用两个值使用DBMS_RCVCAT工具包就可以注销数据库:

posted @ 2011-12-29 16:39 Ronger 阅读(17) 评论(0) 编辑

1、Oracle公司推荐的官方准备途径

  一般来讲,Oracle的考试内容比较多,并且考题也很细,对动手能力要求很强。因此,为了有足够的把握,一定要提前充分准备,而且一定要注重动手实践。在Oracle官方网站上推荐的通过认证的途径如下,可以进行参考。

  Oracle大学:Oracle大学提供的教师引导及基于技术的训练(Instructor-led training and technology- based training)是准备OCP认证的最好方式,这些课程将为你打下需要通过OCP认证的知识基础。你可以查阅一下课程表来选择理想的准备方式,你当地的Oracle大学可以在这方面给你一些最好的建议。你可以访问Oracle的网站http://education.oracle.com/,获得更多的信息。

  自己准备:实战经验是加深你对Oracle考试内容理解的最好方式。Oracle建议你将理论学习拓展,在实际工作或是练习中使用新学到的技巧和知识来自学。

  考试内容检查表:使用考试内容检查表(Test Content Checklist)来确定你必须准备的所有题目。Oracle会不断地更新考试内容检查表,所以请访问Oracle网站 httP://www.oracle.com/education/certification下载最新的考试指南。

  其它考试工具:模拟考试题及自我测试软件可以帮助你更好地准备OCP认证考试。Oracle和自我测试软件公司(Self Test Software)联合出品了一些高质量的考试软件以帮助考生更好地准备OCP认证考试,这些软件可以通过 Oracle 网站 http://www.oracle.com/education/certification定购。

  事实上,绝大部分的大陆同学都是通过参加培训班来准备考试的,它们不仅辅导通过考试的知识,而且其他信息包括如何报名,考场上如何应考,都可以得到辅导。以上Oracle官方的介绍只是一般地对你进行一下有关备考的初级教育,事实上,正像我们前面说过的,作为一个庞大的数据库系统,要想掌握好Oracle(更不要说完全掌握了——我甚至怀疑是否有人真正完全掌握过Oracle),从任何角度而言都不是一件易事。除非你有足够的决心和耐心,准备将Oracle当作你的职业之路并致力于数据库技术的研究,你才有可能真正了解这个庞杂系统的精髓。以下的一些论述将有助于你对Oracle有一个初步的了解。

  2、Oracle数据库技术基本知识

  (1)Oracle数据库涵盖了数据库技术的方方面面。

  尽管关系型数据库从原理上来讲并不是很难,有一些数据库知识的人掌握这些原理并不会花很大的气力,而且,一般的关系型数据库软件,譬如 SQL Server,用起来并不复杂,但Oracle绝对与众不同。作为有史以来最成功的关系型数据库软件,Oracle的实现方式和管理维护手段非常丰富,它涉及到很多方面的细节技术。单从任何一个侧面来理解它,是难观其全貌的。要想真的精通它,没有两三年功夫是不行的。单是Oracle的技术文档,就足够淹没你的! 具体说来,Oracle技术包括以下几个主要方面:Oracle系统结构和原理、Oracle数据库的安装和配置、Oracle数据库的管理、Oracle的数据备份与恢复技术、Oracle的性能调整、Oracle的新产品特性(Java支持、应用服务器、时间空间系列、文本服务等)、Oracle的并行服务器技术、Oracle的数据仓库技术、Oracle的对象类型和对象一关系模型等技术……

  毫不夸张地说,以上任何一个部分单独拿出来都是很大的题目!

  (2)Oracle技术发展快,技术的关联性大。

  尽管Oracle只是一个数据库系统,但在实际应用中,你不可能只面对数据库本身。譬如,你在做Oracle数据库的网络管理,你将不可避免地遇到如何与网络通讯、防火墙的技术兼容的问题。同理,你在做其它方面的工作,也肯定有方方面面的技术关联问题需要解决。而且更要命的是,这些技术(包括Oracle本身)发展速度都非常快,这就使得跟上它们的发展成为一件十分费劲的事情。

  不过幸运的是,我们并不需要同时了解Oracle的所有方面,Oracle提供了很多应用方向,我们可以按照偏好,选择其中的一个方向,集中时间和精力,努力在这个方向做到有所成就还不是一件很难的事情。由于Oracle目前已是世界上最主要的数据库供应商和第二大软件公司,Oracle的数据库技术已经被广泛应用于各个领域,因而市场上对Oracle人才的需求量是相当之大,获得OCP认证不愁找不到工作。而以后我们可以在工作中学以致用,再努力地钻研Oracle数据库及相关技术。

  3、入门者如何起步?

  说了这么多,想必您可能已经有些心动,那么,面对Oracle这样一个庞然大物,你也许会觉得无从下手。为此,我们有一些建议:

  (1)找一本有关数据库原理的书,掌握关系数据库的基本原理——如果你没有学过这样的课程的话。

  (2)阅读参考书并结合上机操作,掌握SQL的一般原理及基本用法。

  (3)至少买一本Oracle入门级的参考书,并找到一台安装了Oracle的某个版本(Oracle7.3以上,最好是 Oracle 8)计算机,建立起上机学习环境。

  其中第三点尤其重要,因为没有实践经验,想通过Oracle认证只是痴人说梦。或者如果你的预算比较充分,你可以选择参加培训。在选择培训班的时候一定要选择Oracle授权的培训班,这样培训的质量才有保证,同时,在报名考试的时候还可以享受一定的折扣。

  与其他很多考试不同,OCP并没有真正意义上的参考书,你要做的就是在上机中不断熟悉Oracle的各种应用,书只是用来查阅和参考的。因为从根本上来讲,Oracle数据库是一门实践性很强的技术,而Oracle认证主要考的是动手能力。因此,没有实践经验,而只靠背学习资料是根本无法通过Oracle认证考试的。以下是市面上常见的一些书,在此列出,希望能对大家有一些帮助。

  初级的:《轻松掌握SQL结构化查询语言》,《轻松掌握Oracle数据库开发》,《Oracle开发指南》,《Oracle初学者指南》,《Oracle8 PL/SQL程序设计》。

  高级的;《Oracle服务器技术精粹》,《Oracle8/8i开发使用手册》,《Oracle8份与恢复手册》,《Oracle8性能优化与管理手册》。

很多IT专业人士都不相信Oracle DBA在除技术之外还有更高的含金量。通常情况下,Oracle DBA可以负责数据库设计、运行、备份以及恢复,同时还要密切关注整个项目开发的全过程。因此,一名成功的Oracle DBA既要具有过硬的技术水平,又要有出色的协调能力,同时,对于操作系统以及计算机理论的深入了解也是必须的。因此,DBA必须要具有计算机专业、通信专业、商务管理专业的学士或硕士学位。

  而OCP认证考试在Oracle管理领域内是衡量一个人专业技术水平掌握程度的一个很好的标准,但有了OCP证书并不等于你就学会了Oracle专业技术。很多获得OCP证书,接触IT行业只有数周的人并不能够完全理解Oracle管理的所有概念。

  其实Oracle认证证书只是让雇主了解到来应聘的人通过了Oracle数据库方面的技术考试。而实际上,Oracle认证也只是衡量一个应聘者的一个标准之一,其他的标准还有:

  1.出色的交际能力。Oracle DBA通常都要和IT行业的技术专家打交道,因此,他或她就必须能够为所有访问Oracle数据库的开发人员或程序员清晰明了的解释Oracle概念。有些时候,Oracle DBA也是一名管理人员,因此,也同样要求他在参与战略发展计划以及数据库设计上要有出色的交际能力。

  2.同类的专业学位。大多数成功的Oracle专业人士都要求由计算机或信息系统专业学士学位。对于更高的职位,比如Oracle DBA,很多雇主都要求由计算机专业硕士学位或MBA。

  3.一定的实践经验。这是有了OCP证书的新人们最担心的一件事情。很多有了OCP证书又没有工作经验的人都在抱怨没有OCP证书就不会有工作经验,没有工作经验就不会有工作。这是现在人才市场上一个很棘手的问题。

  4.丰富的数据库理论知识。除了要掌握OCP所要求的技术知识外,一名成功的Oracle专业人士还要有与数据库以及数据库设计相关的软件知识,包括数据库标准化理论以及采用统一建模语言(UML)的面向对象模型,当然还有其他的数据库设计方法相关知识,比如CORBA和J2EE。

  归根结底,OCP并不能完全衡量一个人的实际水平,而只是为非IT行业人士进入Oracle领域提供一个方法。

 

 一、定位

Oracle分两大块,一块是开发,一块是管理。开发主要是写写存储过程、触发器什么的,还有就是用Oracle的Develop工具做form.有点类似于程序员,需要有较强的逻辑思维和创造能力,个人觉得会比较辛苦,是青春饭;管理则需要对Oracle数据库的原理有深刻的认识,有全局操纵的能力和紧密的思维,责任较大,因为一个小的失误就会down掉整个数据库,相对前者来说,后者更看重经验。

因为数据库管理的责任重大,很少公司愿意请一个刚刚接触Oracle的人去管理数据库。对于刚刚毕业的年轻人来说,可以先选择做开发,有一定经验后转型,去做数据库的管理。当然,这个还是要看人个的实际情况来定。

二、学习方法

我的方法很简单,就是:看书、思考、写笔记、做实验、再思考、再写笔记。

看完理论的东西,自己静下心来想想,多问自己几个为什么,然后把所学和所想的知识点做个笔记;在想不通或有疑问的时候,就做做实验,想想怎么会这样,同样的,把实验的结果记下来。思考和做实验是为了深入的了解这个知识点。而做笔记的过程,也是理清自己思路的过程。

学习的过程是使一个问题由模糊到清晰,再由清晰到模糊的过程。而每次的改变都代表着你又学到了一个新的知识点。

学习的过程也是从点到线,从线到网,从网到面的过程。当点变成线的时候,你会有总豁然开朗的感觉。当网到面的时候,你就是高手了。

很多网友,特别是初学的人,一碰到问题就拿到论坛上来问,在问前,你有没有查过书,自己有没有研究过,有没有搜索一下论坛?这就叫思维惰性。由别人来回答你的问题,会让你在短时间内不费劲地弄懂这个知识点,然而通过自己的努力去研究它,不但会更深入的了解这个知识点,更重要的是在研究的过程会提高你解决问题和分析问题的能力。总的来说,没有钻研的学习态度,不管学什么东西,都不会成功的。

当然,初学的人很多时候是因为遇到问题时,无从下手,也不知道去哪里找资料,才会到论坛上提问题的。但我认为,在提问的时候,是不是可以问别人是如何分析这个问题?从哪里可以找到相关的资料?而不是这个问题的答案是什么?授人以鱼不如授人以渔。

遇到问题了。如果是概念上的问题,第一时间可以找tahiti.oracle.com,这里会给你最详细的解释。如果在运行的过程中出了什么错误。可以去metalink看看。如果是想知道事务的处理的经验之谈。可以去asktom.当然。这里只是相对而言。

三、Oracle的体系

Oracle的体系很庞大,要学习它,首先要了解Oracle的框架。在这里,简要的讲一下Oracle的架构,让初学者对Oracle有一个整体的认识。

1、物理结构(由控制文件、数据文件、重做日志文件、参数文件、归档文件、密码文件组成)

控制文件:包含维护和验证数据库完整性的必要信息、例如,控制文件用于识别数据文件和重做日志文件,一个数据库至少需要一个控制文件。

数据文件:存储数据的文件。

重做日志文件:含对数据库所做的更改记录,这样万一出现故障可以启用数据恢复。一个数据库至少需要两个重做日志文件。

参数文件:定义Oracle例程的特性,例如它包含调整SGA中一些内存结构大小的参数。

归档文件:是重做日志文件的脱机副本,这些副本可能对于从介质失败中进行恢复很必要。

密码文件:认证哪些用户有权限启动和关闭Oracle例程。

2、逻辑结构(表空间、段、区、块)

表空间:是数据库中的基本逻辑结构,一系列数据文件的集合。

段:是对象在数据库中占用的空间。

区:是为数据一次性预留的一个较大的存储空间。

块:ORACLE最基本的存储单位,在建立数据库的时候指定。

3、内存分配(SGA和PGA)

SGA:是用于存储数据库信息的内存区,该信息为数据库进程所共享。它包含Oracle 服务器的数据和控制信息,它是在Oracle服务器所驻留的计算机的实际内存中得以分配,如果实际内存不够再往虚拟内存中写。

PGA:包含单个服务器进程或单个后台进程的数据和控制信息,与几个进程共享的SGA 正相反PGA 是只被一个进程使用的区域,PGA 在创建进程时分配在终止进程时回收。

4、后台进程(数据写进程、日志写进程、系统监控、进程监控、检查点进程、归档进程、服务进程、用户进程)

数据写进程:负责将更改的数据从数据库缓冲区高速缓存写入数据文件

日志写进程:将重做日志缓冲区中的更改写入在线重做日志文件

系统监控:检查数据库的一致性如有必要还会在数据库打开时启动数据库的恢复

进程监控:负责在一个Oracle 进程失败时清理资源

检查点进程:负责在每当缓冲区高速缓存中的更改永久地记录在数据库中时,更新控制文件和数据文件中的数据库状态信息。

归档进程:在每次日志切换时把已满的日志组进行备份或归档

服务进程:用户进程服务。

用户进程:在客户端,负责将用户的SQL语句传递给服务进程,并从服务器段拿回查询数据。

5、Oracle例程:Oracle例程由SGA内存结构和用于管理数据库的后台进程组成。例程一次只能打开和使用一个数据库。

6、SCN(System ChangeNumber):系统改变号,一个由系统内部维护的序列号。当系统需要更新的时候自动增加,他是系统中维持数据的一致性和顺序恢复的重要标志。

四、深入学习

管理:可以考OCP证书,对Oracle先有一个系统的学习,然后看Oracle Concepts、Oracle online document,对oracle的原理会有更深入的了解,同时可以开始进行一些专题的研究如:RMAN、RAS、STATSPACT、 DATAGUARD、TUNING、BACKUP&RECOVER等等。

开发:对于想做Oracle开发的,在了解完Oracle基本的体系结构之后,可以重点关注PL/SQL及Oracle的开发工具这一部分。 PL/SQL主要是包括怎么写SQL语句,怎么使用Oracle本身的函数,怎么写存储过程、存储函数、触发器等。 Oracle的开发工具主要就是Oracle自己的Developer Suite(Oracle Forms Developer and Reports Developer这些),学会如何熟练使用这些工具。 

 

 

 

http://oracle.chinaitlab.com/Special/Oracle_OCP/index.htm

 

 

posted @ 2011-12-29 16:37 Ronger 阅读(15) 评论(0) 编辑
  2011年12月28日

因为很少用到, 所以几乎忘记了这几个函数, 不过它们还是很有用的使用它们可以大大简化一些SQL文的语法, 至于效率问题,
如CCW所说它们和EXISTS, IN 之类没有什么差别, 而且要具体问题具体分析
其中ANY和SOME在意思上是相同的,
可以相互替代.
举几个例子来说明ALL和ANY的用法
1. SELECT * FROM TABLEA WHERE FLD > ALL(SELECT FLD FROM TABLEA)
这相当于
SELECT * FROM TABLEA WHERE FLD > (SELECT MAX(FLD) FROM TABLEA)


2. SELECT * FROM TABLEA WHERE FLD > ANY(SELECT FLD FROM TABLEA)
这相当于
SELECT * FROM TABLEA WHERE FLD > (SELECT MIN(FLD) FROM TABLEA)


3. SELECT * FROM TABLEA WHERE FLD = ANY(SELECT FLD FROM TABLEA)
这相当于
SELECT * FROM TABLEA WHERE FLD IN (SELECT FLD FROM TABLEA)


最后, 关于HAVING它是用于合计计算的运算符, 它和WHERE有着不同的含义
当使用GROUP时HAVING是对各组中的记录进行比较的意思,
换句话说它是选择一组数据的条件
而WHERE则和分组无关, 它是选择一行数据的条件
比如,
SELECT NAME, AVG(PRICE) FROM STORE GROUP BY NAME HAVING AVG(PRICE) > 10
这里的HAVING是WHERE无法替代的
至于效率, WHERE是在生成结果集之前就完成的处理,
而HAVING则要等到结果集做成后在循环执行的处理, 自然效率要低一些, 因此在只需要对行进行操作的时候, 不要使用HAVING。

posted @ 2011-12-28 17:14 Ronger 阅读(27) 评论(0) 编辑

一:分析函数over
Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于每个组返回多行,而聚合函数对于每个组只返回一行。

 

统计各班成绩第一名的同学信息

NAME   CLASS S                       
----- -----
----------------------
fda    1      80                   
ffd    1     
78                   
dss    1      95                   
cfe    2     
74                   
gds    2      92                   
gf     3     
99                   
ddd    3      99                   
adf    3     
45                   
asdf   3      55                   
3dd    3     78  

 

 

  通过:  
    --
    select *
from                                                                      

   
(                                                                           

    select name,class,s,rank()over(partition by class order by s desc) mm
from t2
   
)                                                                           

    where mm=1
    ----
    得到结果:
    NAME   CLASS
S                      
MM                                                                                       

    ----- ----- ---------------------- ----------------------
    dss   
1      95                      1                     
    gds    2     
92                      1                     
    gf     3     
99                      1                     
    ddd    3     
99                      1         
  
    注意:
   
1.在求第一名成绩的时候,不能用row_number(),因为如果同班有两个并列第一,row_number()只返回一个结果         
   
2.rank()和dense_rank()的区别是:
      --rank()是跳跃排序,有两个第二名时接下来就是第四名
     
--dense_rank()l是连续排序,有两个第二名时仍然跟着第三名

 

 

 

二:开窗函数          
      开窗函数指定了分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化,举例如下:
1:    
   over(order by salary) 按照salary排序进行累计,order by是个默认的开窗函数  
   over(partition by deptno)按照部门分区

2:
  over(order by salary range between 5 preceding and 5 following)
   每行对应的数据窗口是之前行幅度值不超过5,之后行幅度值不超过5

 

例如:对于以下列
     aa
     1
     2
     2
     2
     3    
     4

     5
     6
     7
     9

SQL>select  sum(aa)over(order by aa range between 2 preceding and 2 following) from A1;

 得出的结果是

   AA SUM
---------------------- -------------------------------------------------------
  1    10
  2   14
  2   14
  2   14
  3   18
  4   18
  5   22
  6   18
  7   22
  9   9    

就是说,对于aa=5的一行 ,sum为 5-1<=aa<=5+2 的和
对于aa=2来说 ,sum=1+2+2+2+3+4=14 ;
又如 对于aa=9 ,9-1<=aa<=9+2 只有9一个数,所以sum=9 ;

 

3:其它:
over(order by salary rows between 2 preceding and 4 following)
每行对应的数据窗口是之前2行,之后4行
4:下面三条语句等效:
over(order by salary rows between unbounded preceding and unbounded following)
每行对应的数据窗口是从第一行到最后一行,等效:
over(order by salary range between unbounded preceding and unbounded following)
等效
over(partition by null)

 

 

 

--

 

常用的分析函数如下所列:

row_number() over(partition by ... order by ...)
rank() over(partition by ... order by ...)
dense_rank() over(partition by ... order by ...)
count() over(partition by ... order by ...)
max() over(partition by ... order by ...)
min() over(partition by ... order by ...)
sum() over(partition by ... order by ...)
avg() over(partition by ... order by ...)
first_value() over(partition by ... order by ...)
last_value() over(partition by ... order by ...)
lag() over(partition by ... order by ...)
lead() over(partition by ... order by ...)

--

--

--

 

常用的分析函数如下所列:


 

1、row_number() over(partition by ... order by ...)
2、rank() over(partition by ... order by ...)
3、dense_rank() over(partition by ... order by ...)
4、count() over(partition by ... order by ...)
5、max() over(partition by ... order by ...)
6、min() over(partition by ... order by ...)
7、sum() over(partition by ... order by ...)
8、avg() over(partition by ... order by ...)
9、first_value() over(partition by ... order by ...)
10、last_value() over(partition by ... order by ...)
11、lag() over(partition by ... order by ...)
12、lead() over(partition by ... order by ...)

 

 

 

关于partition by


 

这些都是分析函数,好像是8.0以后才有的 row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开时排序)
rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内)
dense_rank()是连续排序,有两个第二名时仍然跟着第三名。

相比之下row_number是没有重复值的 lag(arg1,arg2,arg3):
arg1是从其他行返回的表达式 arg2是希望检索的当前行分区的偏移量。是一个正的偏移量,时一个往回检索以前的行的数目。 arg3是在arg2表示的数目超出了分组的范围时返回的值。

 

 

1.
select deptno,row_number() over(partition by deptno order by sal) from
emp order by deptno;
2.
select deptno,rank() over (partition by deptno
order by sal) from emp order by deptno;
3.
select deptno,dense_rank()
over(partition by deptno order by sal) from emp order by deptno;
4.
select
deptno,ename,sal,lag(ename,1,null) over(partition by deptno order by ename) from
emp ord er by deptno;
5.
select deptno,ename,sal,lag(ename,2,'example')
over(partition by deptno order by ename) from em p
order by
deptno;
6.
select deptno, sal,sum(sal) over(partition by deptno) from
emp;--每行记录后都有总计值  select deptno, sum(sal) from emp group by deptno;
7.
求每个部门的平均工资以及每个人与所在部门的工资差额


 

select deptno,ename,sal ,
     round(avg(sal) over(partition by deptno))
as dept_avg_sal,
     round(sal-avg(sal) over(partition by deptno)) as
dept_sal_diff
from emp;

 

 

 

 

 



 

posted @ 2011-12-28 15:45 Ronger 阅读(25) 评论(0) 编辑
  2011年12月27日
如何实现分页提取记录
方法1:oracle的ROWNUM伪列返回查询的行序号。
  例如要查询表的前10条记录,可以使用
  select * from tablename where ROWNUM<=10
  但是要返回第11-第20条记录,尝试以下的语句
  select * from tablename where ROWNUM<=20 and ROWNUM>=11;
  这个人报错。返回0条记录。因为ROWNUM是伪列,不能用>=条件
  使用以下方法可以查询第11-第20条记录
  select * from
  (select ROWNUM rn ,t.* from tablename t where ROWNUM<=20) where rn>=11;
方法2:使用分析函数ROW_NUMBER实现分页
  select * from (select ROW_NUMBER() OVER (ORDER BY id) rn,t.* from tablename t)
    where rn between 11 and 20;
方法3:使用集合运算MINUS实现分页
  select * from tablename where ROWNUM<=20 MINUS
  select * from tablename where ROWNUM<11;
点评:方法1在查找前几页时速度很快。但在数据量很大时,最后几页速度比较慢。
方法2查询效率比较稳定,是推荐使用的方法。
方法3只适合查询结果在200行以内的情况,记录数很多时会导致oracle错误,需谨慎使用。
posted @ 2011-12-27 18:12 Ronger 阅读(14) 评论(0) 编辑
  2011年12月26日
摘要: 1.ASCII返回与指定的字符对应的十进制数;View Code SQL>selectascii('A')A,ascii('a')a,ascii('0')zero,ascii('')spacefromdual;AAZEROSPACE------------------------------------659748322.CHR给出整数,返回对应的字符;View Code SQL>selectchr(54740)zhao,chr(65)chr65fromdual;ZHC---赵A3.CONCAT连接两个字符串;View阅读全文
posted @ 2011-12-26 13:37 Ronger 阅读(16) 评论(0) 编辑
  2011年12月19日
摘要: 问题如下:SQL> conn scott/tiger@vm_databaseConnected to Oracle Database 11g Enterprise Edition Release 11.1.0.6.0Connected as scott。。。。。。SQL> drop table student2;drop table student2ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效=========================================================解决方法如下:===========阅读全文
posted @ 2011-12-19 15:59 Ronger 阅读(336) 评论(0) 编辑
  2011年12月9日
摘要: 检查点是一个数据库事件,它把修改数据从高速缓存写入磁盘,并更新控制文件和数据文件。检查点分为三类:1)局部检查点:单个实例执行数据库所有数据文件的一个检查点操作,属于此实例的全部脏缓存区写入数据文件。触发命令:svmrgrl>alter system checkpoint local;这条命令显示的触发一个局部检查点。2)全局检查点:所有实例(对应并行数据服务器)执行数据库所有所有数据文件的一个检查点操作,属于此实例的全部脏缓存区写入数据文件。触发命令svrmgrl>alter system checkpoint global;这条命令显示的触发一个全局检查点。3)文件检查点:所有阅读全文
posted @ 2011-12-09 10:36 Ronger 阅读(147) 评论(1) 编辑
  2011年10月10日
摘要: 一、维护数据的完整性概述:数据的完整性用于确保数据库数据遵从一定的商业和逻辑规则。在Oracle中,数据完整性可以使用约束、触发器、应用程序(过程、函数)三种方法来实现,在这三种方法中,因为约束易于维护,并且具有最好的性能,所以作为维护数据完整性的首选。1、约束约束用于确保数据库数据满足特定的商业规则。在Oracle中,约束包括:not null、unique、primary key, foreign key和check五种。A、not null(非空)如果在列上定义了not null,那么当插入数据时,必须为列提供数据。B、unique(唯一)当定义了唯一约束后,该列值是不能重复的,但是可.阅读全文
posted @ 2011-10-10 14:20 Ronger 阅读(26) 评论(0) 编辑
昵称:Ronger
园龄:2年2个月
粉丝:10
关注:19
<2012年2月>
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

搜索

 
 

常用链接

我的标签

随笔分类

随笔档案

相册

积分与排名

  • 积分 - 4685
  • 排名 - 13778

阅读排行榜

评论排行榜

推荐排行榜