oracle数据库精确到10的-6次方

更详细的一张结构图如下

由Oracle实例和Oracle数据库两大部分组成。

是一种数据库访问机制,主要由内存结构和进程结构组成。

实例的后台进程有5个是必须的

SMON 系统监视器进程

PMON 进程监视器进程

DBWR 数据库书写器

每个实例只能操作其对应的一个数据库,但一个数据库可以同时被几个实例操作(RAC)

由以下三种操作系统文件组成:

与Oracle服务器的连接

一个连接即称为一个会话,连接可分为以下两种:

一个用户进程对应创建一个服务器进程,用户进程与服务器进程是一对一的关系。

多个用户进程同时对应一个服务器进程。

用户进程与服务器进程运行在同一台计算机相同的操作系统下,用户进程与Oracle服务器的通信是通过操作系统内部的进程通信(inter processcommunication,IPC)机制来建立的。

2、客户端-服务器(client-server)(两层模型)方式

用户进程与Oracle服务器的通信是通过网络协议(如TCP/IP)来完成的。

用户的个人计算机通过网络与应用服务器或网络服务器进行通信,该应用服务器或网络服务器同样再通过网络与运行数据库的计算机连接。

2、检查是否有相同的SQL正文,没有就进行以下编译处理,否则跳过。

2)通过数据字典检查表和列的定义

3)对所操作的对象加编译锁,防止编译期间的对象定义被改变

6)将编译后的代码和执行计划放入共享SQL区

由服务器进程执行SQL语句。

由服务器进程选择所需的数据行,需要时排序(PGA中),返回给用户进程。

SGA包含以下几大块:

固定区域(Fixed Size):存储SGA中各个组件的信息,大小不能修改

可变区域(Variable Size):包括共享池、大池、流池、JAVA池

重做日志缓冲区缓存(Redo log buffer cache):大小通常大于参数log_buffer的设置,因为在内存中还要设置保护页对log buffer进行保护。

以下命令可以看到SGA的内存分配概览

用于存放SQL语句、PL/SQL代码、数据字典、资源锁和其他控制信息。它由初始化参数SHARED_POOL_SIZE控制其大小。它包含以下几个缓冲区:

cache):用于存储经常使用的数据字典信息。比如(表的定义、用户名、口令、权限、数据库的结构等)。Oracle运行过程中经常访问该缓存以便解析SQL语句,确定操作的对象是否存在,是否具有权限等。如果不在数据字典缓存中,服务器进程就从保存数据字典信息的数据文件中将其读入到数据字典缓存中。数据字典缓存中保存的是一条一条的记录(就像是内存中的数据库),而其他缓存区中保存的是数据块信息。

2、库缓存(LibraryCache):用于保存最近解析过的SQL语句、PL/SQL过程。Oracle在执行一条SQL语句、一段PL/SQL过程前首先在库缓存中搜索,如果查到它们已经解析过了,就利用库缓存中的解析结果和执行计划来执行,而不必重新对它们进行解析,显著提高执行速度。Oracle是通过比较SQL或PL/SQL语句的正文来决定两个语句是否相同的,只有正文完全相同,Oracle才重用已存在的编译后的代码和执行计划。应该尽量用绑定变量的方式写SQL,绑定变量不是在编译阶段赋值的,而是在运行阶段赋值的,因此语句可以不用重新编译。

库缓存的管理采用LRU(least recently used)的队列算法,即最近最少使用的队列算法。刚使用的内存块放在LRU队列的头部,而进程每次从队列的尾部获取内存块,获取到的内存块立即移至队列头部。最终使长时间没有使用到的内存块自然移到了队列的尾部而被最先使用。

Oracle没有提供单独设置库缓存或数据字典缓存空间大小的方法,而是通过设置共享池的大小来间接设置,通过参数SHARED_POOL_SIZE可调整,其大小受限于SGA的尺寸SGA_MAX_SIZE参数。

ORACLE将每一条SQL语句分解为可共享、不可共享的两部分。

共享SQL区:存储的是最近执行的SQL语句、解析后的语法树和优化后的执行计划。这样以后执行相同的SQL语句就直接利用在共享SQL区中的缓存信息,不必重复语法解析了。Oracle在执行一条新的SQL语句时,会为它在共享SQL区中分配空间,分配的大小取决于SQL语句的复杂度。如果共享SQL区中没有空闲空间,就利用LRU算法,释放被占用的空间。

私有SQL区(共享服务器模式):存储的是在执行SQL语句时与每个会话或用户相关的私有信息。其他会话即使执行相同的SQL语句也不会使用这些信息。比如绑定变量、环境和会话参数。

3、SQL和PL/SQL结果缓存:此高速缓存用于存储SQL查询或PL/SQL函数的结果,以加快其将来的执行速度。

4、锁与其他控制结构:存储ORACLE例程内部操作所需的信息,如各种锁、闩、寄存器值等。

也叫块缓存区,用于存放从数据文件读取的数据块,其大小由初始化参数DB_CACHE_SIZE决定。

工作原理是通过LRU队列(最近最少使用Least Recently Used)。查询时,Oracle会先把从磁盘读取的数据放入内存供所有用户共享,以后再查询相关数据时不用再次读取磁盘。插入和更新时,Oracle会先在该区域中缓存数据,之后批量写到硬盘中。通过块缓冲区,Oracle可以通过内存缓存提高磁盘的I/O性能。

数据高速缓存块由许多大小相等的缓存块组成,这些缓存块分为3大类:

1)脏缓存块(Dirtybuffers):脏缓存块中保存的是被修改过的缓存块。即当一条SQL语句对某个缓存块中的数据进行修改后,该缓存块就被标记为脏缓存块。最后该脏缓存块被DBWn进程写入到硬盘的数据文件中永久保存。

2)命中缓存块(Pinnedbuffers):命中缓存块中保存的是最近正在被访问的缓存块。它始终被保留在数据高速缓存中,不会被写入数据文件。

3)空闲缓存块(Freebuffers):该缓存块中没有数据,等待被写入数据。oracle从数据文件中读取数据后,寻找空闲缓存块,以便写入其中。

1)DIRTY列表中保存已经被修改但还没有被写入到数据文件中的脏缓存块。

2)LRU列表中保存所有的缓存块(还没有被移动到DIRTY列表中的脏缓存块、空闲缓存块、命中缓存块)。当某个缓存块被访问后,该缓存块就被移动到LRU列表的头部,其他缓存块就向LRU列表的尾部移动。放在最尾部的缓存块就最先被移出LRU列表。

数据高速缓存的工作原理过程:

1)ORACLE在将数据文件中的数据块复制到数据高速缓存之前,先在数据高速缓存中找空闲缓存块,以便容纳该数据块。Oracle 将从LRU列表的尾部开始搜索,直到找到所需的空闲缓存块为止。

2)如果先搜索到的是脏缓存块,将该脏缓存块移动到DIRTY列表中,然后继续搜索。如果搜索到的是空闲缓存块,则将数据块写入,然后将该缓存块移动到DIRTY列表的头部。

3)如果能够搜索到足够的空闲缓存块,就将所有的数据块写入到对应的空闲缓存块中,搜索写入过程结束。

4)如果没有搜索到足够的空闲缓存块,则ORACLE就先停止搜索,而是激活DBWn进程,开始将DIRTY列表中的脏缓存块写入到数据文件中。

5)已经被写入到数据文件中的脏缓存块将变成空闲缓存块,并被放入到LRU列表中。执行完成这个工作后,再重新开始搜索,直到找到足够的空闲缓存块为止。

这里可以看出,如果你的高速缓冲区很小的,不停地写写,造成很大I/O开销。

块缓冲区可以配置1、2或3个缓冲池,默认只有第一个:

2)保持池(Keep pool):缓存需要多次重用的数据,长期保存在内存中,缺省值为0。

3)回收池(Recyclepool):用来缓存很少重用的数据,用完就释放,缺省值为0。

原来只有一个默认池,所有数据都在这里缓存。这样会产生一个问题:大量很少重用的数据会把需重用的数据“挤出”缓冲区,造成磁盘I/O增加,运行速度下降。后来分出了保持池和回收池根据是否经常重用来分别缓存数据。这三部分内存池需要手动确定大小,并且之间没有共享。例如:保持池中已经满了,而回收池中还有大量空闲内存,这时回收池的内存不会分配给保持池,这些池一般被视为一种非常精细的低级调优设备,只有所有其他调优手段大多用过之后才应考虑使用。

在9i之前,数据缓冲区的大小是由DB_BLOCK_BUFFER决定的,缓冲区的大小为DB_BLOCK_SIZE(Oracle数据块大小,创建数据库时设定好后续不能改变)和DB_BLOCK_BUFFERS(缓冲区块的个数)这两个参数的乘积,改变需重启数据库。之后的版本则是由参数DB_CACHE_SIZE及DB_nK_CACHE_SIZE确定。不同的表空间可以使用不同的块大小,在创建表空间中加入参数BLOCKSIZE指定该表空间数据块的大小,如果指定的是2k,则对应的缓冲区大小为DB_2K_CACHE_SIZE参数的值,如果指定的是4k,则对应的缓冲区大小为DB_4K_CACHE_SIZE参数的值,以此类推。如果不指定BLOCKSIZE,则默认为参数DB_BLOCK_SIZE的值,对应的缓冲区大小是DB_CACHE_SIZE的值。

数据库高速缓冲区缓存大小的建议可以参看内存缓冲区顾问v$db_cache_advice

Oracle在DML或DDL操作改变数据写到数据库高速缓冲区缓存之前,先写入重做日志缓冲区,随后LGWR后台进程再把日志条目写到磁盘上的联机日志文件中。日志缓冲区的大小由初始化参数log_buffer决定大小。

以下情况触发LGWR进程将日志缓存数据写到联机日志文件中:

2)缓存达到1MB或1/3满时

4)缓冲区的数据写入磁盘前

可以根据实际业务需要来决定是否在SGA区中创建大池。如果没有创建大池,则需要大量内存空间的操作将占用共享池的内存, 将对系统性能带来影响。

大池没有LRU队列,在共享服务器连接时,PGA的大部分区域(UGA)将放入大池(不包括堆栈区域),并行化的数据库操作、大规模的I/O及备份和恢复操作可能用到大池。大池由初始化参数LARGE_POOL_SIZE确定其大小。

加强对流的支持,大小由参数STREAM_POOL_SIZE确定。流池(如果没有配置流池,则是共享池中至多10%的空间)用于缓存流进程在数据库间移动/复制数据时使用的队列消息。

用于支持在数据库中运行java代码,大小由参数JAVA_POOL_SIZE确定。

一个PGA是一块独占内存区域,Oracle进程以专有的方式用它来存放数据和控制信息。当Oracle进程启动时,PGA也就由Oracle数据库创建了。当用户进程连接到数据库并创建一个对应的会话时,Oracle服务进程会为这个用户专门设置一个PGA区,用来存储这个用户会话的相关内容。当这个用户会话终止时,系统会自动释放这个PGA区所占用的内存。这个PGA区对于数据库的性能有比较大的影响,特别是对于排序操作的性能。

PGA主要包含排序区、会话区、堆栈区和游标区四个部分。通常情况下,系统管理员主要关注的是排序区,在必要时需要手工调整这个排序区的大小。游标区是一个动态的区域,在游标打开时创建,关闭时释放,故在数据库开发时,不要频繁的打开和关闭游标可以改善数据库的性能。其他分区的内容管理员只需要了解其用途,日常的维护交给数据库系统来完成即可。

1、为排序设置合理的排序区大小

当用户需要对数据进行排序时,系统会将需要排序的数据保存到PGA中的一个排序区内,然后在这个排序区内对这些数据进行排序。如需要排序的数据有2M,那么排序区内必须至少要有2M的空间来容纳这些数据。然后排序过程中又需要有2M的空间来保存排序后的结果。由于系统从内存中读取数据比从硬盘中读取数据的速度要快几千倍,为此如果这个数据排序与读取的操作都能够在内存中完成,无疑可以在很大程度上提高数据库排序与访问的性能。如果这个排序的操作都能够在内存中完成,显然这是很理想的。但是如果PGA中的排序区容量不够,不能容纳排序后的数据,系统会从硬盘中获取一个空间,用来保存需要排序的数据。此时排序的效率就会降低许多。为此在数据库管理中,如果发现用户的很多操作都需要用到排序,那么为用户设置比较大的排序区,可以提高用户访问数据的效率。

在Oracle数据库中,这个排序区主要用来存放排序操作产生的临时数据。一般来说,这个排序区的大小占据PGA程序缓存区的大部分空间,这是影响PGA区大小的主要因素。在小型应用中,数据库管理员可以直接采用其默认的值。但是在一些大型的应用中,或者需要进行大量记录排序操作的数据库系统中,管理员可能需要手工调整这个排序区的大小,以提高排序的性能,这可以通过初始化参数SORT_AREA_SIZE来实现。

2、会话区保存着用户的权限等重要信息

会话区保存了会话所具有的权限、角色、性能统计等信息,通常都是由数据库系统自我维护,管理员不用干预。当用户进程与数据库建立会话时,系统会将这个用户的相关权限查询出来,保存在这个会话区内。用户进程在访问数据时,系统会核对会话区内的用户权限信息,看看其是否具有相关的访问权限。

3、堆栈区保存变量信息

保存着绑定变量、会话变量、SQL语句运行时的内存结构等重要的信息。通常都是由数据库系统自我维护,管理员不用干预。这些分区的大小,也是系统根据实际情况来进行自动分配的。当这个用户会话结束时,系统会自动释放这些区所占用的空间。

游标区是一个动态的区域。当用户执行游标语句打开游标时,系统会在PGA中创建游标区,当关闭游标时,这个区域就会被释放。创建与释放需要占用一定的系统资源,花费一定的时间,如果频繁的打开和关闭游标,就会降低语句的执行性能。所以在写语句时,游标最好不要频繁的打开和关闭。

初始化参数OPEN_CURSORS可以根据实际需要来设置,控制用户能够同时打开游标的数量。在确实需要游标的情况下,如果硬件资源支持的话,也可以放宽这个限制。

专用服务器模式下,进程和会话是一对一的关系,UGA被包含在PGA中,在共享服务器模式下,进程和会话是一对多的关系,所以UGA就不再属于PGA了,而会在大型池(LargePool)中分配。但如果从大型池中分配失败,如大型池太小,或是根本没有设置大型池,则从共享池(SharedPool)中分配。

1、重做日志写进程LGWR

Oracle使用快速提交的技术,保证系统的效率,并保证系统崩溃时所提交的数据可以得到恢复,引入系统改变号SCN。

SCN是单调递增的正整数,与Oracle内部时间戳对应,保证系统中数据的同步和读一致性。

1)服务器进程把提交的记录连同产生的SCN号一起写入重做日志缓存。

2)LGWR把缓存中一直到提交的记录和SCN连续的写入联机重做日志文件中。在此之后,Oracle就能够保证即使在系统崩溃的情况下所有已提交的数据也可以得到恢复(联机重做日志文件在归档前不能被覆盖重写)。

3)Oracle通知用户进程提交已经完成。

4)服务器进程修改数据库高速缓存中的数据状态,释放资源和打开锁。

写日志要比写数据效率高,记录格式紧凑,I/O量少,顺序写入。

2)日志缓存中变化记录超过1MB

3)日志缓存中的记录超过缓冲区容量的1/3

4)DBWR写入数据文件之前

日志挖掘器( log miner)工具,可将日志文件中的内容转化为用户能够理解的正文信息。

1)当脏缓冲区的数量超过了所设定的限额

2)所设定的时间间隔已到

3)当有进程需要数据库高速缓冲区却找不到空闲的缓冲区时

5)当某个表被删除或截断时

6)当某个表空间被设置为只读时

7)当对某个表空间进行联机备份时

8)当某个临时表空间被设置为脱机状态或正常状态时

3、系统监视器进程SMON

当Oracle系统由于某种原因如断电,SGA中已经提交但还未被写入数据文件中的数据将丢失。当数据库重启时,系统监视器进程SMON将自动执行Oracle实例的恢复工作。

1)执行前滚,将已提交到重做日志文件中但还未写到数据文件中的数据写到数据文件中。(通过SCN号识别提交记录)

2)前滚完成后立即打开数据库,这时数据文件中可能还有一些没有提交的数据。(之所以这样安排,主要是为了提高系统的效率)

3)回滚未提交的事务(数据)

4)执行一些磁盘空间的维护工作

4、进程监视器进程PMON

当某个用户进程崩溃时(如未正常退出),进程监视器进程PMON将负责清理工作。

1)回滚用户当前的事务

2)释放用户所加的所有表一级和行一级的锁

3)释放用户所有的其它资源

5、检查点进程CKPT

Oracle为了提高系统效率和保证数据库的一致性,引入检查点事件。

DBWR将SGA中所有已改变了的数据库高速缓冲区缓存中的数据(包括已提交的和未提交的)写到数据文件中时,将产生检查点事件。

保证了所有到检查点为止的变化了的数据都已经写到了数据文件中,在实例恢复时检查点之前的重做日志记录已经不再需要,从而加快了实例的恢复速度。

检查点事件发生时,Oracle要将检查点号写入数据文件头中,还要将检查点号、重做日志序列号、归档日志名称和SCN号都写入控制文件中。

过于频繁的检查点会使联机操作受到冲击,因此需要在实例的恢复速度和联机操作之间折中。(大多在20分钟以上)

查看数据库的检查点号:

查看数据库当前的SCN号:

当数据库运行在归档日志模式下时,ARCH/ARCn进程将把日志切换后的联机重做日志文件中的数据复制到归档日志文件中,保证不会因致联机日志文件组的循环切换而导致日志数据丢失,从而保证数据库的可完全恢复。

归档日志文件是脱机的。

Oracle确保在一组重做日志的归档操作完成之前不会重新使用该组重做日志。

  1.掌握SELECT语句的多表连接查询。

  2.掌握SELECT语句的子查询。

根据Oracle数据库scott方案下的emp表和dept表,完成下列操作:

  1.查询所有工种为CLERK的员工的姓名及其部门名称。

  2.查询所有部门及其员工信息,包括那些没有员工的部门。

  3.查询所有员工及其部门信息,包括那些还不属于任何部门的员工。

  4.查询在SALES部门工作的员工的姓名信息。

注意两种实现方式,在行和列上的变化。

  5.查询所有员工的姓名及其直接上级的姓名。

  6.查询入职日期早于其上级领导的所有员工的信息。

  7.查询从事同一种工作但不属于同一部门的员工信息。

  8.查询10号部门员工及其领导的信息。

 12.查询工资高于公司平均工资的所有员工信息。

 13.查询与SMITH员工从事相同工作的所有员工信息。

 14.查询工资比SMITH员工工资高的所有员工信息。

 15.查询比所有在30号部门中工作的员工的工资都高的员工姓名和工资。

 16.查询部门人数大于5的部门的员工信息。

 17.查询所有员工工资都大于2000的部门的信息。

 18.查询人数最多的部门信息。

 19.查询至少有一个员工的部门信息。

 20.查询工资高于本部门平均工资的员工信息。

 21.查询工资高于本部门平均工资的员工信息及其部门的平均工资。

 22.查询每个员工的领导所在部门的信息。

 23.查询平均工资低于2000的部门及其员工信息。

  1.如果需要将雇员表中的所有行连接到雇员表中的所有行,则应创建哪种类型的连接?(B)

  2.如果需要从顾客表和订单表中查询所有顾客及其下达的所有订单,并且要求查询结果中先按顾客所在公司名称的升序排列,再按订单金额的降序排列。应执行以下哪条语句?(B)

哪个字句的语法有错误?(E)

哪些子句限制了返回结果?请选择两个正确答案。(BD)

5.在SELECT语句中各个子句的正确顺序是什么?(C)

 6.以下哪个运算符可用于多行子查询?(A)

 7.假设数据库中有顾客表和订单历史记录表。其中,顾客表中包括:客户标识NUMBER(5)、姓名VARCHAR2(25)、信贷限额NUMBER(8,2)、开户日期(DATE);订单历史记录表中包括:订单标识NUMBER(5)、客户标识NUMBER(5)、订单日期(DATE)、总计NUMBER(8,2)。以下哪种方案需要使用子查询来返回需要的结果?(D)

A.需要显示每个顾客账户下的开户日期

B.需要显示顾客下达订单的各个日期

C.需要显示在特定日期下达的所有订单

D.需要显示与编号为25950的订单的下达日期相同的所有订单

8.如果希望在报表中显示成本值高于所有产品平均成本的产品名称,应使用以下哪些SELECT语句?(B)

9.如果单行子查询返回了空值且使用了等于比较运算符,外部查询会返回什么结果?(B)

10.如果需要创建包含多行子查询的SELECT语句,可以使用哪个(些)比较运算符?(A)

触发器的定义就是说某个条件成立的时候,触发器里面所定义的语句就会被自动的执行。

因此触发器不需要人为的去调用,也不能调用。

然后,触发器的触发条件其实在你定义的时候就已经设定好了。

这里面需要说明一下,触发器可以分为语句级触发器和行级触发器。

详细的介绍可以参考网上的资料,简单的说就是语句级的触发器可以在某些语句执行前或执行后被触发。而行级触发器则是在定义的了触发的表中的行数据改变时就会被触发一次。

1、 在一个表中定义的语句级的触发器,当这个表被删除时,程序就会自动执行触发器里面定义的操作过程。这个就是删除表的操作就是触发器执行的条件了。
2、 在一个表中定义了行级的触发器,那当这个表中一行数据发生变化的时候,比如删除了一行记录,那触发器也会被自动执行了。

触发器名:触发器对象的名称。由于触发器是数据库自动执行的,因此该名称只是一个名称,没有实质的用途。触发时间:指明触发器何时执行,该值可取:
before:表示在数据库动作之前触发器执行;
after:表示在数据库动作之后触发器执行。
触发事件:指明哪些数据库动作会触发此触发器:
insert:数据库插入会触发此触发器;
update:数据库修改会触发此触发器;
delete:数据库删除会触发此触发器。
表 名:数据库触发器所在的表。
for each row:对表的每一行触发器执行一次。如果没有这一选项,则只对整个表执行一次。

触发器能实现如下功能:

1、 允许/限制对表的修改
2、 自动生成派生列,比如自增字段
4、 提供审计和日志记录
5、 防止无效的事务处理
6、 启用复杂的业务逻辑

1)、下面的触发器在更新表tb_emp之前触发,目的是不允许在周末修改表:

2)、使用触发器实现序号自增

3)、当用户对test表执行DML语句时,将相关信息记录到日志表

--下面我们来分别执行DML语句

3)、创建触发器,它将映射emp表中每个部门的总人数和总工资

4)、创建触发器,用来记录表的删除数据

--创建记录表(包含数据记录)

5)、创建触发器,利用视图插入数据

--创建视图连接两张表

--现在就可以利用视图插入数据

6)、创建触发器,比较emp表中更新的工资

--必须以DBA身份登陆才能使用此数据字典

1、定义所谓存储过程(Stored Procedure),就是一组用于完成特定数据库功能的SQL语句集,该SQL语句集经过
编译后存储在数据库系统中。在使用时候,用户通过指定已经定义的存储过程名字并给出相应的存储过程参数
来调用并执行它,从而完成一个或一系列的数据库操作。

2、存储过程的创建Oracle存储过程包含三部分:过程声明,执行过程部分,存储过程异常。

(1)无参存储过程语法

(2)带参存储过程实例

(3)带参数存储过程含赋值方式

其中参数IN表示输入参数,是参数的默认模式。
OUT表示返回值参数,类型可以使用任意Oracle中的合法类型。
OUT模式定义的参数只能在过程体内部赋值,表示该参数可以将某个值传递回调用他的过程
IN OUT表示该参数可以向该过程中传递值,也可以将某个值传出去。

(4)存储过程中游标定义使用

(3)过程调用方式三(SQL命令行方式下)

在数据库中事务是工作的逻辑单元,一个事务是由一个或多个完成一组的相关行为的SQL语句组成,通过事务机制确保这一组SQL语句所作的操作要么都成功执行,完成整个工作单元操作,要么一个也不执行。

如:网上转帐就是典型的要用事务来处理,用以保证数据的一致性。

SQL92标准定义了数据库事务的四个特点:

  • 原子性(Atomicity):一个事务里面所有包含的SQL语句是一个执行整体,不可分割,要么都做,要么都不做。
  • 一致性(Consistency):事务开始时,数据库中的数据是一致的,事务结束时,数据库的数据也应该是一致的。
  • 隔离性(Isolation):是指数据库允许多个并发事务同时对其中的数据进行读写和修改的能力,隔离性可以防止事务的并发执行时,由于他们的操作命令交叉执行而导致的数据不一致状态。
  • 持久性 (Durability) : 是指当事务结束后,它对数据库中的影响是永久的,即便系统遇到故障的情况下,数据也不会丢失。

一组SQL语句操作要成为事务,数据库管理系统必须保证这组操作的原子性(Atomicity)、一致性(consistency)、隔离性(Isolation)和持久性(Durability),这就是ACID特性。

因为Oracle中支持多个事务并发执行,所以会出现下面的数据异常。

当一个事务修改数据时,另一事务读取了该数据,但是第一个事务由于某种原因取消对数据修改,使数据返回了原状态,这是第二个事务读取的数据与数据库中数据不一致,这就叫脏读。

如:事务T1修改了一条数据,但是还未提交,事务T2恰好读取到了这条修改后了的数据,此时T1将事务回滚,这个时候T2读取到的数据就是脏数据。

是指一个事务读取数据库中的数据后,另一个事务则更新了数据,当第一个事务再次读取其中的数据时,就会发现数据已经发生了改变,这就是不可重复读取。不可重复读取所导致的结果就是一个事务前后两次读取的数据不相同。

如:事务T1读取一行记录,紧接着事务T2修改了T1刚刚读取的记录,然后T1再次查询,发现与第一次读取的记录不同。

如果一个事务基于某个条件读取数据后,另一个事务则更新了同一个表中的数据,这时第一个事务再次读取数据时,根据搜索的条件返回了不同的行,这就是幻读。

如:事务T1读取一条指定where条件的语句,返回结果集。此时事务T2插入一行新记录,恰好满足T1的where条件。然后T1使用相同的条件再次查询,结果集中可以看到T2插入的记录,这条新纪录就是幻读。

事务中遇到的这些异常与事务的隔离性设置有关,事务的隔离性设置越多,异常就出现的越少,但并发效果就越低,事务的隔离性设置越少,异常出现的越多,并发效果越高。

针对读取数据时可能产生的不一致现象,在SQL92标准中定义了4个事务的隔离级别:

Read only:事务中不能有任何修改数据库中数据的操作语句,是Serializable的一个子集。

Read write:它是默认设置,该选项表示在事务中可以有访问语句、修改语句,但不经常使用。

设置一个事务的隔离级别:

注意:这些语句是互斥的,不能同时设置两个或两个以上的选项。

设置单个会话的隔离级别:

在执行使用COMMIT语句可以提交事务,当执行了COMMIT语句后,会确认事务的变化,结束事务,删除保存点,释放锁。当使用COMMIT语句结束事务之后,其他会话将可以查看到事务变化后的新数据。

保存点(savepoint):是事务中的一点,用于取消部分事务,当结束事务时,会自动的删除该事务所定义的所有保存点。当执行ROLLBACK时,通过指定保存点可以回退到指定的点。

数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。

在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改;加了共享锁的数据对象可以被其他事务读取,但不能修改。

根据保护对象的不同,Oracle数据库锁可分为:

  • DDL lock(dictionary locks,字典锁):用于保护数据库对象的结构(例如表、视图、索引的结构定义)。
  • PCM locks(并行高速缓存管理锁):用于OPS(并行服务器)中。

在Oracle中最主要的锁是DML锁,DML锁的目的在于保证并发情况下的数据完整性。在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。

锁出现在数据共享的场合,用来保证数据的一致性。当多个会话同时修改一个表时,需要对数据进行相应的锁定。

锁有“共享锁”、“排它锁”,“共享排它锁”等多种类型,而且每种类型又有“行级锁” (一次锁住一条记录),“页级锁” (一次锁住一页,即数据库中存储记录的最小可分配单元),“表级锁” (锁住整个表)。

6.2 共享锁(S锁)

6.3 排他锁(X锁)

可通过lock table in exclusive mode命令添加X锁。在该锁定模式下,其他用户不能对表进行任何的DML和DDL操作,该表上只能进行查询。

6.4 行级共享锁(RS锁)

update语句添加的,同时该方法也是我们用来手工锁定某些记录的主要方法。比如,当我们在查询某些记录的过程中,不希望其他用户对查询的记录进行更新操作,则可以发出这样的语句。当数据使用完毕以后,直接发出rollback命令将锁定解除。当表上添加了RS锁定以后,不允许其他事务对相同的表添加排他锁,但是允许其他的事务通过DML语句或lock命令锁定相同表里的其他数据行。

6.5 行级排他锁(RX锁)

当进行DML操作时会自动在被更新的表上添加RX锁,或者也可以通过执行lock命令显式的在表上添加RX锁。在该锁定模式下,允许其他的事务通过DML语句修改相同表里的其他数据行,或通过lock命令对相同表添加RX锁定,但是不允许其他事务对相同的表添加排他锁(X锁)。

6.6 共享行级排他锁(SRX锁)

通过lock table in share row exclusive mode命令添加SRX锁。该锁定模式比行级排他锁和共享锁的级别都要高,这时不能对相同的表进行DML操作,也不能添加共享锁。

上述几种锁模式中,RS锁是限制最少的锁,X锁是限制最多的锁。它们的兼容关系如下:

基本上所有的锁都可以由Oracle内部自动创建和释放,但是其中的DDL和DML锁是可以通过命令进行管理的,命令语法:

下图列出产生锁定模式的SQL语句:

当程序对所做的修改进行提交(Commit)或回滚(Rollback)后,锁住的资源便会得到释放,从而允许其他用户进行操作。如果两个事务,分别锁定一部分数据,而都在等待对方释放锁才能完成事务操作,这种情况下就会发生死锁

7. 数据库事务实现机制

几乎所有的数据库管理系统中,事务管理的机制都是通过使用日志文件来实现的,我们来简单介绍一下日志的工作方式。

当用户执行一条修改数据库的DML语句时,DBMS自动在日志文件中写一条记录,显示被这条语句影响的每一条记录的两个副本。一个副本显示变化前的记录,另一个副本显示变化后的记录。当日志写完之后,DBMS才实际对磁盘中的记录进行修改。

如果用户随后执行COMMIT语句,事务结束也被记录在事务日志中。如果用户执行ROLLBACK语句,DBMS检查日志,找出自事务开始以来被修改的记录“以前”的样子,然后使用这些信息恢复它们以前的状态,有效地撤销事务期间对数据库所做的修改。

如果系统出错,系统操作员通常通过运行DBMS提供的特殊恢复程序来复原数据库。恢复程序检查到事务日志末尾,查找故障之前没有被提交的事务。恢复程序回滚没有完全完成的事务,以便仅有被提交的事务反映到数据库中,而故障中正处理的事务被回滚。

事务日志的使用明显增加了更新数据库的开销。在实际中,主流商用DBMS产品使用的日志技术比上述描述的方案更复杂,用以减小这种开销。此外,事务日志通常被存储在高速磁盘驱动器中,不同于存储数据库的磁盘,以减小磁盘访问竞争。某些个人计算机DBMS产品允许关闭事务日志性能,以提高DBMS的性能。

银行转帐的例子是最经典的事务示例:

用户把钱从一个银行账号转账至另一个银行账号,需要将资金从一个银行账号中取出,然后再存入另一个银行账号中。理想来说,这两次操作都应该成功。但是,如果有错误发生,则两次操作都应该失败,否则的话,操作之后其中一个账号中的金额将会是错误的,整个操作过程应该是原子性的,两个操作都是一个原子事务操作的一部分。

-- 从账户一向账户二转账

  -- 如果没有异常,则提交事务

以前虽然在网上看到很多关于Oracle锁机制的描述,但总感觉哪里有缺陷不适合自己,因此花了点时间参考Tom Tyke的《Oracle 9i/10g/11g编程艺术》一书整理了一下Oracle锁相关的知识。

一、Oracle数据库的锁类型:

二、接下来依次讨论以上三种锁结构:

DML锁主要包括TM锁和TX锁,其中TM锁称为意向锁或表级锁,TX锁称为行级锁或事务锁。我们可以认为Oracle只有如下6种LMODE的锁,只是根据锁定的对象不同而有不同的名称,如6号的X锁,既可以是用于锁表的TM锁,也可以是TX锁,也可以是DDL锁。

1.1 TM锁(也叫意向锁/表级锁)

TM锁的兼容性如下:(Y表示兼容,N表示冲突)

TX的本义是Transaction(事务),当一个事务第一次执行数据更改(Insert、Update、Delete)或使用SELECT… FOR UPDATE语句进行查询时,它即获得一个TX(事务)锁,直至该事务结束(执行COMMIT或ROLLBACK操作)时,该锁才被释放。

在同一个事务中,无论是锁定一行,还是一百万行,对于Oracle来说TX锁的开销是一样的。因此Oracle从来都不会锁升级,因为事务锁只含表级锁和行级锁,而行级锁的开销是不随锁定的行数变化的。这点可能与其他数据库不一样,原因是针对Oracle的每行数据,都有一个标志位来表示该行数据是否被锁定。这样就极大的减小了行级锁的维护开销,也不可能出现锁升级。数据行上的锁标志一旦被置位,就表明该行数据被加X锁。

Oracle在数据行上没有S锁,换句话说就是TX锁只有一种--行级独占锁(注意TX锁在v$lock的lmode也是6,但是这个6与TM锁的6号X锁只是因为锁定的对象不同而被叫做了TX锁)

当发出一个DML命令后会话获取一个3号的TM锁,和一个针对特定行的6号TX锁。

行级只有X锁,且锁模式为6,再次重申这里的6并不是指TM的6号表锁。此外Oracle一个事务中无论锁定多少行只会获取一个TX锁,这点上边已经解释过了,但有多少个表对象就会获取多少个TM表级锁。

读永远不会阻止写,因为读只加NULL锁。但有唯一的一个例外,就是select ...for update。

写永远不会阻塞读(默认隔离级别下),因为一致性读的存在,相关原理可以到网上搜索Oracle一致性读的实现,Oracle会通过回滚段(undo)提供给数据的一致性读。

注意:以上说明的读和写不会互相阻塞是指在事务锁(TM)级别不会,但读写之间依然会发生数据库内部闩锁的争用。具体可以参考数据库内部闩锁的博文。

重点:DDL是保护表结构定义的。

当DDL命令发出时,Oracle会自动在被处理的对象上添加DDL锁定,从而防止对象被其他用户所修改。当DDL命令结束以后,则释放DDL锁定。DDL锁定不能显式的被请求,只有当对象结构被修改或者被引用时,才会在对象上添加DDL锁定。

并不是所有DDL都会触发DDL锁,例如现在的创建索引语句,就只会获取一个S模式的TM锁,因此不会阻塞读。而online模式创建索引的语句则只会获取一个RS模式的TM锁,因此连DML也不会被阻塞。

需要注意的是DDL总会提交,即便是执行不成功也是如此,因此如果在事务中执行了DDL语句会导致所有事物被提交。验证很容易,在一个窗口执行一条delete然后执行DDL,你会发现记录被不可逆转的删除了,RollBack无效。因此针对事务中的DDL请务必使用自治事务实现。

DDL锁有3种:(第一种在表对象上的体现就是X模式的TM锁)

一般对表的DDL语句都会获取一个X模式的TM锁,这是为什么在表结构更改时只能查询不能修改的原因。

共享DDL锁的常见情形为创建存储过程时,会尝试为所有涉及到的表添加共享DDL锁,这会允许类似的DDL操作并发,但会阻止所有想要获取排他DDL锁的会话(即更改表结构的会话)。

可以认为这就是4号TM表锁。

会话解析一条语句时,对于该语句引用的每一个对象都会施加解析锁,这个目的是如果以某种方式删除或修改了引用对象,可以将共享池中已经解析的无效缓存语句刷出。

Oracle中的包和包体与java中的接口和类才关系特别类似,我们就根据对比学习一下包和包体吧!

2.oracle包和包体与自定义函数,过程区别

2.1 如果直接create 函数,函数不会出现在包里,而是在function目录下面,如果在包里创建,则会出现在包里,他们两者有什么区别?

直接创建的函数,是数据公共函数。在调用函数的时候直接调用函数名带参数就可以。而建在包体里的函数是私有函数,在有在包体里才能直接用函数名带参数调用。

外部程序要调用需要--包名.函数名(参数)--这样去调用。

Oracle中的包和包体与java中的接口和类才关系特别类似,我们就根据对比学习一下包和包体吧!

2.oracle包和包体与自定义函数,过程区别

2.1 如果直接create 函数,函数不会出现在包里,而是在function目录下面,如果在包里创建,则会出现在包里,他们两者有什么区别?

1)直接创建的函数,是数据公共函数。在调用函数的时候直接调用函数名带上参数就可以。

2)而建在包体里的函数是私有函数,在有在包体里才能直接用函数名带参数调用。

外部程序要调用需要--包名.函数名(参数)--这样去调用。

-- 首先创建一个包含字段comm的emp表,再创建下面的包和包体

游标用来处理从数据库中检索的多行记录(使用SELECT语句)。利用游标,程序可以逐个地处理和遍历一次检索返回的整个记录集。

     为了处理SQL语句,Oracle将在内存中分配一个区域,这就是上下文区。这个区包含了已经处理完的行数、指向被分析语句的指针,整个区是查询语句返回的数据行集。游标就是指向上下文区句柄或指针。

显示游标(需要明确定义!)

F.1字符函数——返回字符值

说明:可以sql和plsql中使用

功能:给出整数X,返回对应的ASCII码字符。CHR和ASCII是一对反函数。

功能:返回字符单词首字母大写,其余小写,单词用空格和非字母字符分隔。

功能:在string1字符左边或右边粘贴数个string2字符,直到字符总字节数达到x字节。string2默认为空格。

如果string2的长度要比X字符少,就按照需要进行复制。如果string2多于X字符,则仅string2前面的X各字符被使用。如果string1长度大于x,则返回string1左端x个字符。

功能:返回字符串每个单词第一个字母大写而单词中的其他字母小写的string,nlsparams

指定了不同于该会话缺省值的不同排序序列。如果不指定参数,则功能和INITCAP相同。Nlsparams可以使用的形式是:‘NLS_SORT=sort’ 这里sort制订了一个语言排序序列。

功能:返回字符串中的所有字母都是小写形式的string。不是字母的字符不变。

功能:返回字符串中的所有字母都是大写的形式的string。不是字母的字符不变。nlsparams参数的形式与用途和NLS_INITCAP中的相同。如果没有设定参数,则NLS_UPPER功能和UPPER相同。

使用位置:过程性语句和SQL语句。

功能:10g新增函数,扩展了REPLACE函数的功能,并且用于按照特定正则表达式的规则替换字符串。其中参数str1指定源字符表达式,pattem指定正则表达式,str2指定替换字符串,pos指定起始搜索位置,occ指定替换出现的第几个字符串,par指定默认匹配操作的文本串。

功能:10g新增函数,扩展了SUBSTR函数的功能,并且用于按照特定表达式的规则返回字符串的子串。其中参数str1指定源字符表达式,pattem指定规则表达式, pos指定起始搜索位置,occ指定替换出现的第几个字符串,par指定默认匹配操作的文本串。

语法1功能:中删除从左/右边算起出现在string1中的字符string2,string2如果是多个字符则逐个单字符比对删除,tring2被缺省设置为单个的空格。当遇到不在string2中的第一个字符,结果就被返回了;

语法2功能:删除左右两边出现在string1中的字符string2,tring2必须为单字符,否则报错。

功能:  返回string的声音表示形式.这对于比较两个拼写不同但是发音类似的单词而言很有帮助,如果字符发音相同,则返回的结果会一致.

SOUNDEX 返回一个与给定的字符串读音相同的字符串

功能:截取字符串,从第a个开始取b个字符,这个务必要注意,是字符。 vachar2最长4000个字节,GBK编码中一个中文字符占2个字节,韩文字符占4个字节,如果string是date或者number的数据类型,会自动转化为varchar2。

查找字符串',,2,'中逗号出现次数

功能: 所有字母大写.(不是字母的字符不变.如果string是CHAR数据类型的,那么结果也是CHAR类型的.如果string是VARCHAR2类型的,那么结果也是VARCHAR2类型的).

说明:可以sql和plsql中使用

功能: 返回string字符串首字符的十进制表示ascii码值。 CHR和ASCII是互为相反的函数.CHR得到给定字符编码的响应字符. ASCII得到给定字符的字符编码.

功能:  得到在str1中包含str2的位置. a>0,str1时从左边开始检查的,开始的位置为a;a<0,那么str1是从右边开始进行扫描的,开始的位置为a。第b次出现的位置将被返回. a和b都缺省设置为1,这将会返回在string1中第一次出现string2的位置.如果string2在a和b的规定下没有找到,那么返回0.位置的计算是相对于string1的开始位置的,不管a和b的取值是多少.

INSTR(C1,C2,I,J) 在一个字符串中搜索指定的字符,返回发现指定的字符的位置;

功能:  和INSTR相同,只是操作的对参数字符使用的位置的是字节.

功能:  返回字符串的长度,特别注意的,对于空的字段,返回为空,而不是0。

功能: 得到用于排序string的字符串字节.所有的数值都被转换为字节字符串,这样在不同数据库之间就保持了一致性. Nlsparams的作用和NLS_INITCAP中的相同.如果忽略参数,会话使用缺省排序.

功能:  返回x的反余弦值. 输入x应该从-1到1之间的数,结果在0到pi之间,输出以弧度为单位.

功能:  返回x的反正弦值. X的范围应该是-1到1之间,返回的结果在-pi/2到pi/2之间,以弧度为单位.

功能:  计算x的反正切值.返回值在-pi/2到pi/2之间,单位是弧度.

功能: 返回x除以y的反正切值.结果在负的pi/2到正的pi/2之间,单位是弧度.

功能:  计算大于或等于x的最小整数值.

功能:  返回x的余弦值. x的单位是弧度.

功能:  返回小于等于x的最大整数值.

功能:  返回x的自然对数. x必须是正数,并且大于0

功能:  计算以x为底的y的对数.底必须大于0而且不等于1, y为任意正数.

功能:  四舍五入函数,y缺省值为0,x保留整数;y>0,x保留小数点右边y位;y<0,x保留小数点左边 |y| 位;可以对时间进行round,效果是只保留年月日。

功能:计算x的正弦值. X是一个以弧度表示的角度.

功能:返回x的双曲正弦值.

功能:  计算x的正切值, x是一个以弧度位单位的角度.

功能:  截取数字函数,只舍不入函数, y缺省值为0,x保留整数;y>0,x保留小数点右边y位;y<0,x保留小数点左边 |y| 位

说明:日期时间函数用于处理date和timestamp类型的数据,除了函数months_between返回数字外,其余均返回date类型,Oracle以7位数字格式来存放日期数据,包括世纪、年、月、日、小时、分钟、秒,并且默认日期显式格式为“DD-MON-YY”。

功能:返回日期d加上x个月后的月份。x可以是任意整数。如果结果日期中的月份所包含的天数比d日期中的“日”分量要少。(即相加后的结果日期中的日分量信息已经超过该月的最后一天,例如,8月31日加上一个月之后得到9月31日,而9月只能有30天)返回结果月份的最后一天。

使用位置:过程性语言和SQL语句。

功能:9i新增函数,返回当前会话时区所对应的日期时间。

功能:9i新增函数,返回当前会话时区所对应的日期时间。

功能:9i新增函数,返回数据库所在时区。

功能:9i新增函数,从日期时间值中取得所需要的特定数据

功能:计算包含日期的d的月份最后一天的日期.这个函数可以用来计算当月中剩余天数.

使用位置:过程性语言和SQL语句。

功能:9i新增函数,返回当前会话时区的日期时间。

功能:计算date1和date2之间相差的月数.如果date1<date2,则返回负数;如果date1,date2这两个日期中日分量信息是相同的,或者这两个日期都分别是所在月的最后一天,那么返回的结果是一个整数,否则包括一个小数,小数为富余天数除以31,Oracle以每月31天为准计算结果。

功能:计算当时区zone1中的日期和时间是d时候,返回时区zone2中的日期和时间.zone1和zone2是字符串. 给出在this时区=other时区的日期和时间。

使用位置:过程性语言和SQL语句。

d::一个有效的日期型变量

功能: 给出日期d和星期string之后计算下一个星期的日期. String是星期几;当前会话的语言指定了一周中的某一天.返回值的时间分量与d的时间分量是相同的.String的内容可以忽略大小写.

使用位置:过程性语言和SQL语句。

功能:将日期d按照由format指定的格式进行四舍五入处理处理.如果没有给format则使用缺省设置`DD`.

使用位置:过程性语言和SQL语句。

功能:返回特定时区时间所对应的格林威治时间。

功能:取得当前的日期和时间,类型是DATE.它没有参数.但在分布式SQL语句中使用时,SYSDATE返回本地数据库的日期和时间.

使用位置:过程性语言和SQL语句。

功能:9i新增函数,返回当前系统的日期时间及时区。

功能:9i新增函数,将符合特定日期和时间格式的字符串转变为INTERVAL DAY TOSECOND类型。

功能:9i新增函数,将符合特定日期和时间格式的字符串转变为TIMESTAMP类型。

功能:9i新增函数,将符合特定日期和时间格式的字符串转变为TIMESTAMP WITHTIME ZONE类型。

功能:9i新增函数,将符合特定日期和时间格式的字符串转变为INTERVAL YEAR TOMONTH类型。

功能:截断日期时间数据,计算截尾到由format指定单位的日期d.缺省参数同ROUNG.

使用位置:过程性语言和SQL语句。如果fmt='mi'表示保留分,截断秒,如此类推。

功能:9i新增函数,返回特定时区与UTC相比的时区偏移。

说明:用于将数值从一种数据类型转换为另一种数据类型。

功能:9i新增函数,将任意字符集的字符串转变为数据库字符集的ASCII字符串。

功能:9i新增函数,用于将位向量值转变为实际的数字值。

功能:用于将一个内置数据类型或集合类型转变为另一个内置数据类型或集合类型。可以作用于长度为0的空字段视图建表格之用。

使用位置:过程性语言和SQL语句。

功能:9i新增函数,用于将输入字符串转变为UNICODE字符串值。

功能:将字符串string从source_set所表示的字符集转换为由dest_set所表示的字符集.如果source_set没有被指定,它缺省的被设置为数据库的字符集.

使用位置:过程性语言和SQL语句。

功能:9i新增函数,用于分解字符串并返回相应的UNICODE字符串。

功能: 将string一个十六进制构成的字符串转换为二进制RAW数值. String中的每两个字符表示了结果RAW中的一个字节..HEXTORAW和RAWTOHEX为相反的两个函数.

使用位置:过程性语言和SQL语句。

功能:该数据类型常用来表示一段时间差, 注意时间差只精确到年和月. precision为年或月的精确域, 有效范围是0到9, 默认值为2。

表示: 该处表示有错误, 123精度是3了, 但系统默认是2, 所以该处应该写成INTERVAL '123' YEAR(3) 或"3"改成大于3小于等于9的数值都可以的

功能:9i新增函数,将RAW类数值rawvalue转换为一个相应的十六进制表示的字符串. rawvalue中的每个字节都被转换为一个双字节的字符串. RAWTOHEX和HEXTORAW是两个相反的函数.

使用位置:过程性语言和SQL语句。

使用位置:过程性语言和SQL语句。

使用位置:过程性语言和SQL语句。

功能:10g新增函数,根据输入的scn值返回对应的大概日期时间,其中number用于指定scn值.

使用位置:过程性语言和SQL语句。

功能:10g新增函数,用于根据输入的timestamp返回所对应的scn值,其中timestamp、用于指定日期时间。

使用位置:过程性语言和SQL语句。

使用位置:过程性语言和SQL语句。

使用位置:在trusted数据库的过程性语句和SQL语句。

功能4:将NUMBER类型的参数num转换为一个VARCHAR2类型的变量.如果指定了format,那么它会控制这个转换处理.表5-5列除了可以使用的数字格式.如果没有指定format,它会控制这个转换过程.下面列出了可以使用的数字格式.如果没有指定format,那么结果字符串将包含和num中有效位的个数相同的字符.

d和g分别表示列小数点和千分位分隔符. String表示了货币的符号.例如,在美国小数点分隔符通常是一个句点(.),分组分隔符通常是一个逗号(,),而千分位符号通常是一个$.

使用位置:过程性语言和SQL语句。

以上正确,需要注意的是不属于转换日期格式标识符需要使用双引号,如上面的"of"

等价于下面,fm有trim的作用去掉多余空格

上述当中,Day\DAY\day等等转换后都是带空格的,而YYYY则不会。

--将number格式转换为货币格式,前面均带空格

功能:9i新增函数,将字符串转变为CLOB类型。Char参数使用NCHAR,NVARCHAR2,NCLOB类型,字符串需要单引号括起来,且在前面加上n.

功能:将符合特定日期格式的字符串转变为date类型. format是一个日期格式字符串.当不指定format的时候,使用该会话的缺省日期格式,需要特别注意的,缺省格式并不适用''这种形式。

功能:9i新增函数,将LONG或LONGROW列的数据转变为相应的LOB类型。但需要注意的是,在单纯的select语句中会报错,如例子所示。

使用位置:过程性语言和SQL语句。

功能:将String转换为一个MLSLABEL类型的变量. String可以是VARCHAR2或者CHAR类型的参数.如果指定了format,那么它就会被用在转换中.如果没有指定format,那么使用缺省的转换格式.

使用位置:过程性语言和SQL语句。

功能:计算所有单字节字符都替位换位等价的多字节字符的String.该函数只有当数据库字符集同时包含多字节和单字节的字符的时候有效.否则, String不会进行任何处理.TO_MULTI_BYTE和TO_SINGLE_BYTE是相反的两个函数.

使用位置:过程性语言和SQL语句。

功能1:将字符串由数据库字符集转变为民族字符集。

功能2:将日期时间值转变为民族字符集。

功能3:将数字值转变为民族字符集。

使用位置:过程性语言和SQL语句。

功能:计算String中所有多字节字符都替换为等价的单字节字符.该函数只有当数据库字符集同时包含多字节和单字节的字符的时候有效.否则, String不会进行任何处理.

使用位置:过程性语言和SQL语句。

功能:将字符串转变为数据库字符集(char_cs)或民族字符集(nchar_cs)

功能:9i新增函数,输入字符串返回相应的UNICODE字符

说明:分组函数也被称为多行函数,它会根据输入的多行数据返回一个结果。主要用于执行数据统计或汇总操作,并且分组函数只能出现在select语句选择列表、order by子句和having子句中。注意分组函数不能直接在plsql中引用,只能在内嵌select语句中使用。

功能:返回一列数据的平均值,缺省使用是ALL修饰符,all表示对所有的值求平均值,distinct排重后再求平均值

使用位置:查询列表和GROUP BY子句.

使用位置:查询列表和GROUP BY子句.

功能:得到查询中行的数目.如果使用了*获得行的总数.如果在参数中传递的是选择列表,那么计算的是非空数值。我基于10G测试,有主键情况下,count(主键)最快,count(1)和count(*)调动主键统计,时间上一样;无主键情况下count(索引列)最快,但需要注意count(列名)统计不包括null,count(常量)和count(*)包括null

功能:返回特定数值在一组行数据中的累积分布比例。

功能:返回特定数据在一组行数据中的等级。

功能:9i新增,不能单独使用,必须与其他分组函数结合使用。通过使用该函数,可以取得排序等级的第一级,然后然后使用分组函数汇总该等级的数据。

功能:9i新增,用于区分分组结果中的重复行。

功能:用于确定统计结果是否使用了特定的表达式,返回0则用到了表达式,1则未用。

功能:9i新增,用于返回对应于特定行的grouping位向量的值。

功能:9i新增,不能单独使用,必须与其他分组函数结合使用。通过使用该函数,可以取得排序等级的最后一级,然后使用分组函数汇总该等级的数据。

使用位置:trusted数据库的选择列表和GROUP BY子句.过程性语言和SQL语句。

功能:获得选择列表或表达式的最大值,ALL表示对所有的值求最大值,DISTINCT表示对不同的值求最大值,相同的只取一次

使用位置:仅用于查询选择和GROUP BY子句.

功能:获得选择列表或表达式的最小值,ALL表示对所有的值求最小值,DISTINCT表示对不同的值求最小值,相同的只取一次

使用位置:仅用于查询选择和GROUP BY子句.

功能:该函数用于返回特定数值在统计级别中所占的比例。

功能:9i新增,用于返回在统计级别中处于某个百分点的特定数值(按照连续分布模型确定)。

功能:9i新增,用于返回在统计级别中处于某个百分点的特定数值(按照离散分布模型确定)。

功能:该函数用于返回特定数值中所占据的等级。

功能:获得选择列表的标准差.标准差为方差(VARIANCE)的平方根, ALL表示对所有的值求标准差,DISTINCT表示只对不同的值求标准差.

使用位置:仅用于查询选择和GROUP BY子句.

功能:返回统计标准差,其数值是统计方差的平方根.

使用位置:仅用于查询选择和GROUP BY子句.

功能:返回采样标准差,其数值是采样方差的平方根.

功能:返回选择的数值和总和

使用位置:仅用于查询选择和GROUP BY子句.

使用位置:仅用于查询选择和GROUP BY子句.

使用位置:仅用于查询选择和GROUP BY子句.

使用位置:仅用于查询选择和GROUP BY子句.

说明:10g新增,为了扩展集合类型(嵌套表和VARRAY)的功能,新增的针对集合类型的函数。

功能:10g新增函数,返回嵌套表的实际元素个数。

功能:10g新增函数,用于根据输入列和被选中行建立嵌套表结果。

功能:10g新增函数,用于生成嵌套表的超集(包含所非空的嵌套表)。

功能:10g新增函数,用于根据嵌套表和元素个数,生成嵌套表的超集(包含所非空的嵌套表)。

功能:改函数用于取消嵌套表中的重复结果,并生成新的嵌套表。

说明:对象函数用于操纵REF对象。REF对象实际是指对象类型数据的指针。

功能:该函数用于返回参照对象exp所引用的对象实例。

功能:该函数可以基于对象视图或对象表(存在基于主键的对象标识符)的一行数据建立REF。

功能:该函数用于返回对象行所对应的REF值。

功能:该函数用于将REF值转变为十六进制字符串。

功能:该函数用于返回行对象所对应的对象实例数据,其中expr用于指定行对象的别名。

说明:除了上述涉及的函数外,Oracle还提供了一些单行函数。

使用位置:过程性语言和SQL语句。

功能:9i新增,依次查找各参数,遇到非NULL则返回,各参数或表达式数据类型必须一致,如果都为null则返回null。

功能:9i新增,用于返回xml方案under_path路径所对应的相对层数,其中参数n用于指定相对层数。

数据类型按照下面规定的内部数据类型的编码作为一个数字进行返回.

功能:获得一个空的LOB提示符(locator).EMOTY_CLOB返回一个字符指示符,而EMPTY_BLOB返回一个二进制指示符, 用来对大数据类型字段进行初始化操作的函数.

使用位置:过程性语言和SQL语句.

功能:9i新增,用于确认xml节点路径是否存在,返回0表示不存在,1表示存在。.

使用位置:过程性语言和SQL语句.

功能:9i新增,用于返回xml节点路径下的相应内容。.

使用位置:过程性语言和SQL语句.

功能:9i新增,用于返回xml节点路径下的值。.

使用位置:过程性语言和SQL语句.

功能:计算参数中最大的表达式.所有表达式的比较类型以expr1为准,比较字符的编码大小。

使用位置:过程性语言和SQL语句.

功能:返回标签(label)列表中最大的下界.每个标签必须拥有数据类型MLSLABEL、RAWMLSLABEL或者是一个表因字符串文字.函数只能用于truested oracle库.

使用位置:过程性语言和SQL语句.

功能:计算参数中最小的表达式.所有表达式的比较类型以expr1为准,比较字符的编码大小。

使用位置:过程性语言和SQL语句.

功能:与GREATEST_UB函数相似,本函数返回标签列表的最小上界.

使用位置:过程性语言和SQL语句.

功能:该函数用于返回字节数在特定字符集中占有的字符个数。

功能:该函数用于返回字符集的ID号。

功能:该函数用于返回字符集ID号所对应的字符集名。

功能:9i新增,用于比较表达式expr1和expr2,相等返回null,否则返回expr1.

功能:用于将NULL转变为实际值,如果expr1是NULL,那么返回expr2,否则返回expr1,expr1、expr2两者必须为同类型或expr2可以隐式转换为expr1,否则会报错。

特别的date可以隐式转换为number,所以下面正确

特别的date可以隐式转换为number,所以下面正确

功能:此函数为分析函数,有别于本文介绍中的其他函数,更详细看本博客“分析函数”专题

使用位置:过程性语言和SQL语句

功能:9i新增,用于返回特定XML资源所对应的相对路径。

功能:9i新增(只适用于层次查询),用于返回从根到节点的列值路径。

功能:该函数用于返回应用上下文的特定属性值,获得系统信息,其中context为上下文名,而attribute为应用上下文名,此函数可以得到oracle主机及客户端的信息。

功能:9i新增,根据列或属性生产类型为DBUriType的URL。

功能:该函数用于生产类型为RAW的16字节的唯一标识符,每次调用该函数都会发生不同的RAW数据。

功能:该函数用于返回唯一的类型ID值。

功能:9i新增,用户汇总所有XML文档,并生成一个XML文档。

功能:9i新增,根据数据库表的行和列生成一个XMLType实例。

功能:获得当前数据库用的惟一标识,标识是一个整数.

使用位置:过程性语言和SQL语句.

功能:9i新增,用于更新特定XMLType实例相对应节点路径的内容。

功能:取得当前oracle用户的名字,返回的结果是一个VARCHAR2型字符串.

使用位置:过程性语言和SQL语句.

功能:根据参数option,取得一个有关当前会话信息的VARCHAR2数值.

使用位置:过程性语言和SQL语句.

返回当前用户环境的信息,opt可以是:

ENTRYID返回会话人口标志

LANGUAGE返回当前环境变量,包括语言、地区、字符集

LANG返回当前环境的语言的缩写

TERMINAL返回用户的终端或机器的OS标示符

功能:9i新增,用于汇总多个XML块,并生成XML文档。

功能:9i新增,用于生成XML块,并增加”column”作为属性名。

功能:9i新增,用于连接多个XMLType实例,并生成一个新的XMLType实例。

功能:9i新增,用于返回XML块。

功能:9i新增,用于返回xmltype实例中顶级节点一下的varray元素。

功能:9i新增,用于将xmltype实例按照XSL样式进行转换,并生成新的xmltype实例。

Oracle备份方式分类:
Oracle有两类备份方式:
(1)物理备份:是将实际组成数据库的操作系统文件从一处拷贝到另一处的备份过程,通常是从磁盘到磁带。
物理备份又分为冷备份、热备份;  
(2)逻辑备份:是利用SQL语言从数据库中抽取数据并存于二进制文件的过程。

备份方式的优缺点及使用时机比较如下图:

Oracle备份方式介绍:
1、物理备份之冷备份(条件-NonArchiveLog):
  当数据库可以暂时处于关闭状态时,我们需要将它在这一稳定时刻的数据相关文件转移到安全的区域,当数据库遭到破坏,再从安全区域将备份的数据库相关文件拷贝回原来的位置,这样,就完成了一次快捷安全等数据转移。由于是在数据库不提供服务的关闭状态,所以称为冷备份。冷备份具有很多优良特性,比如上面图中我们提到的,快速,方便,以及高效。一次完整的冷备份步骤应该是:


(2)拷贝相关文件到安全区域(利用操作系统命令拷贝数据库的所有的数据文件、日志文件、控制文件、参数文件、口令文件等(包括路径))
(3)重新启动数据库(startup)
以上的步骤我们可以用一个脚本来完成操作:
  !cp 文件   备份位置(所有的日志、数据、控制及参数文件);
这样,我们就完成了一次冷备份,请确定你对这些相应的目录(包括写入的目标文件夹)有相应的权限。
恢复的时候,相对比较简单了,我们停掉数据库,将文件拷贝回相应位置,重启数据库就可以了,当然也可以用脚本来完成。

非归档模式的数据库,丢失数据文件

?  丢失某个数据库文件,造成了数据库无法启动,同时数据库处于非归档模式,也没有冷备份,启动时的错误信息如下:

?从数据库中删除该数据文件

?该方法可正常打开数据库,但该datafile中的数据将丢失

?如果误删除了system表空间的datafile,则该方法不奏效

?如果该表空间还包含其它数据文件,用EXP把数据备份出来,然后删除表空间,重建表空间,将数据导入。如果不包含其它数据文件,则直接删除表空间就可以了。

归档模式数据库丢失某数据文件,无备份,但有该数据文件创建以来的归档日志

?归档模式的数据库,丢失了某个数据库文件,造成了数据库无法启动,同时没有数据库的全备份,但有该数据文件创建以来的归档日志,数据库无法启动:

?启动数据库到mount状态

?手工创建丢失的数据文件

?  利用归档日志对数据文件进行恢复

?该方法可正常打开数据库,而且不会丢失数据

?  丢失的数据文件不能是系统文件

?  不能丢失或损坏控制文件

?  如果该日志已经归档,用下面的命令清除日志内容

?如果该日志没有归档,用下面的命令清除日志内容

?尽快做一个数据库全备份

?误删除了redo log,或者redo log被损坏,数据库不能打开:

?情况1:当前日志文件还存在,只是逻辑损坏,并且当前日志没有未决事务需要实例恢复

?一般情况下,该方法不奏效,如果clear报错,则用其它方法.

?情况2:当前日志完全损坏,且有未决事务,数据库有备份

?尽快做一个数据库全备份

?情况3:当前日志完全损坏,且有未决事务,数据库无备份

?尽快做一个数据库全备份

临时表空间的数据文件损坏

?  临时表空间的数据文件发生损坏,系统出现故障,如何恢复

?  在10g及以上版本数据库,启动数据库时,如果发现临时数据文件损坏,会自动创建,如果在数据库运行过程中,可以手工重建:

?  在10g以前版本数据库,可以在数据库打开后或运行过程中,手工重建就可以了

UNDO数据文件损坏,数据库无法启动

?  Undo数据文件发生了丢失或损坏,数据库启动报错:

?  如果数据库有备份,则利用备份进行恢复

?  如果数据库没有备份,则利用重建undo表空间的方式进行恢复

?  控制文件发生了损坏,数据库已经无法启动,报错信息如下:

?  情况一:控制文件有镜像,且镜像控制文件没有被损坏

?将没有损坏的控制文件覆盖掉损坏的控制文件,或者修改参数文件的control_files参数,去掉损坏的控制文件

?  情况二:控制文件无镜像,或者镜像的所有控制文件都损坏了

?如果控制文件有备份,从备份中恢复控制文件

?如果控制文件有snapshot,将snapshot控制文件替换掉原损坏控制文件

?如果没有备份,也没有trace备份,只能手工编写脚本创建控制文件,前提是你对数据库文件结构非常清楚

?  恢复和打开数据库

?如果是用create controlfile …resetlogs方式重建的控制文件,或者通过备份或快照恢复的控制文件

使用以下命令设置默认实例

注:该命令在命令行下执行,并非sqlplus中。

dba的密码遗忘,无法以dba账号(sys或system)登陆

1)以本地用户身份进入sqlplus(前提:确保本地系统用户在oracle的DBA group中)

处理方法及步骤:1、查看用户的proifle是哪个,一般是default:

2、查看指定概要文件(如default)的密码有效期设置:

3、将密码有效期由默认的180天修改成“无限制”:

修改之后不需要重启动数据库,会立即生效。

4、修改后,还没有被提示ORA-28002警告的帐户不会再碰到同样的提示;

已经被提示的帐户必须再改一次密码,举例如下:

oracle11g启动参数resource_limit无论设置为false还是true,密码有效期都是生效的,所以必须通过以上方式进行修改。以上的帐户名请根据实际使用的帐户名更改。

如果在命令行中输入 sqlplus 地址,系统提示“无监听程序”。

2、点击 监听程序 LISTENER,在 监听位置 页面中,增加地址:


3、点击菜单 文件-保存网络配置

--------------------------

--------------------------

1)单独安装一个32位版的JDK就可以直接配置了;

该文档主要目的是降低现场实施人员及用户Oracle数据库的管理难度,提高Oracle数据库技术能力,文档针对Oracle9i、10g两个版本提供了一套完整的Oracle数据库监控、管理的思路、方法步骤,依照该手册进行Oracle数据库的日常工作,能有效的把握Oracle后台数据库的整体运行健康状况,通过收集相关重要信息分析,能很好的防范即将出现的系统风险,系统出现问题后尽快的定位问题,现场解决一部分常规数据库问题。对其它专业要求比较强的数据库问题,也能为后续Oracle专家深入分析、诊断问题提供规范、完整的信息。

文档按问题处于的阶段分两部分-事前阶段、事中阶段,事前阶段描述了每天、每周末、每月末针对数据库所需进行的管理工作,如:日常监控,包括有环境监控、数据库运行状况监控、性能监控;日常数据库管理,包括:系统运行快照采集、表空间管理、数据库备份恢复、表、索引统计分析、TOP会话、SQL执行计划信息查看等。涉及有相关图形化管理工具使用方法、数据库自动脚本、命令使用方法。事中阶段描述了数据库发生问题时处理思路,需要收集哪些相关信息。

日常工作-每天应做工作内容

1、工作内容-日常环境监控

1.1系统运行环境监控

查看Oracle 数据文件、控制文件、联机日志及归档日志存放的文件系统或裸设备空间使用情况。

重点关注Oracle软件及数据文件所在卷空间使用率:

检测操作系统CPU、内存、交换区、I/O配置状况

CPU、内存、网络、IO、进程、页面交换:topas

CPU、内存、网络、IO、进程、}

number默认情况下,精度为38位,取值范围1~38之间

它实际上是磁盘上的一个变长类型,会占用0~22 字节的存储空间。

只知道默认小数点位是0,

网上关于number的资料很多了,学习总结了下,如果问题及不足,欢迎指正。

有效数位:从左边第一个不为0的数算起,小数点和负号不计入有效位数。

精确到小数点右边s位,并四舍五入。然后检验有效数位是否<=p;

如果s>p,小数点右边至少有s-p个0填充。

精确到小数点左边s位,并四舍五入。然后检验有效数位是否<=p+|s|

二、oracle的number类型存储结构:oracle采用变长存储number数据类型(按一定规则进行转换成2进制编码格式存储)。

对正数来说, 符号位省略, 对0来说, oracle存储的是X80(128)。

HEAD部分为一个字节8位, 就是前面看到的128, 193,62。由该部分我们可以看出number类型的基本信息,因为设计这种存储格式的时候, oracle希望以十六进制00-FF来表示所有

的number, 所以为了编码的对称, 首先将number分为正负, 所以以00-FF的中间位置80, 也就是十进制的128来表示0, HEAD部分小于80,即为负数,大于80即为正数。ORACLE再次对

从HEAD部分我们可以也看出数据的位数信息,是否含有小数,可以根据HEAD的信息判断小数点的位置。由于数据部分低位2的n次方位个0是不被存储的,数据展现的时候oracle

根据HEAD的信息给补充末位的0。

然后,我们再来看数据部分, ORACLE对十进制的数字(整数部分,小数部分正好相反)是两位两位进行存储的(从右往左的顺序), 例如对1234, ORACLE会分别对12, 34进行存储.

所以只需要对(+-)1-99进行编码

--对于含小数(负数、整数2种情况)的情况:

用十六进制64-2表示,就是100-2)。

不足2位的末尾补充一个1,也就是等于1.2220

符号位: 用的是(+-)1-99都不可能用到的编码66(102)来表示,有资料说为了处理排序问题(未加考证)。根据HEAD部分可以做初步判断,根据我们说的HEAD部分的四个范围,

如果2个数值不在一个范围,立即可以看出大小,如果在一个范围其实也可以根据其正负+绝对值来进行排序了,正数绝对值大的就大,负数则相反,为何还要用到这个符号位?

三、相关bug:时间久了,也无从考证,写出来共享吧,也许有人会用到:

03年用9i的时候,做税收会计余额累计,当时遇到number类型的bug,数据结构为number(20,2),进行数据累计的时候当余额等于1(也许是0,印象模糊了)的时候,出现03113

错误,每次执行都一样,当时搜索了资料也说是oracle一个bug,后来采取了一些回避手段把金额先乘以100,换算完后再除以100,展现给用户,也就是利用了number(p,0)整数

类型(不存储小数部分,减少产生溢出等bug的几率)来解决了当时的问题。供参考!

}

删除表中所有的数据(保留表结构)

DML 语句(数据操作语句)

DDL 语句(数据定义语句)

DCL 语句(数据控制语言)

* Select 语句中, NUMBER 型数据可以使用算术运算符创建表达式.

- 表达式中可使用小括号强行改变运算顺序

连接运算符'||'可以把列与字符,或其它表达式连接在一起,得到一个新的字符串,实现'合成'列的功能.

- 重命名查询结果中的字段,以增强可读性

- 如果别名中使用特殊字符,或者是强制大小写敏感需使用双引号

- 空值是无效的,未指定的,未知的或不可预知的值

- 空值不等同于空格或者0

* 算术表达式中如果出现空值,则整个表达式结果为空

* 连接表达式中出现的空值被当作一个空的(长度为零的)字符串处理

* 在缺省情况下,查询结果中包含所有符合条件的记录行,名括重复行.

* 使用 DISTINCT 关键字可林查询结果中清除重复行

* DISTINCT 的作用范围是后面所有字段的组合

* 查询结果缺省按照记录的插入顺序进行排序

* 也可使用 ORDER BY 子句对查询结果进行排序,排序方式包括升序(ASC,

* 查询语句中使用字符串和日期

- 字符串和日期值要用单引扩起来

- 日期值格式敏感,缺省的日期格式是'DD-MON-RR'

* 获取当前缺省日期格式

* 查询工资(sal) 之间的数据

* 使用 LIKE 运算符执行模糊查询(通配查询)

- % 表示零或多个字符

- 对于特殊符号可使用 ESCAPE 标识符来查找

* 查询姓名第个字是'A'的数据

* 查询姓名有下划线'_'的数据

* 可使用小括号强行改变运算顺序

date………………日期型,有效表数范围:公元前471211到公元后47121231

- blob………………二进制大对象类型,最大长度4GB

- clob………………字符大对象类型,最大长度4GB

- bfile   在数据库外部保存的大型二进制文件大对象类型,最大长度4GB

* 注意:位单为字节(不够指定长度也算指定长度空间)

* 注意:位单为字节(长度为数据的长度,超过长度报错)

* 注意:小数只保留指定位数

* Oracle 函数分为单行函数和多行函数两大类

- 接受参数并返回处理结果

- 对每一返回行起作用

* 字符大小写转换函数

* 注意:函数可嵌套使用

Oracle内部以数字格式存储日期和时间信息:世纪,,,,小时,分钟,

- 可使用sysdate函数获取当前系统日期和时间

* 日期型数据的算术运算

- 日期型数据可以直接加或减一个数值,结果仍为日期

- 两个日期型数据可以相减,结果为二者相差多少天

* 数据类型转换包括隐含转换和显式转换两方式,建议使用显式的数据类型转换,确保SQL语句的可靠性

* to_char()函数可以将日期型数值转换为字符串形式

* 说明:除上述格式符外,日期模式串中还可直接出现如下字符( - : ; / );

* 如要显示其它文本字符串则需使用双引号括起来;也可在械串的开头使用"fm"

* 记以去掉数字前面的零

* to_date()函数可以将字符串转换为日期型数值形式

* to_char()函数可以将数字值转换为字符串形式

- 0 代表一位数字,强制显示0

- $ 放置一个美圆符$

- L 放置一个本地货币符

* to_number()函数可以将字符串转换为数字值形式

* 通用函数适用于任何类型数据(包括空值):

* NVL()函数用于将空值null替换为指定的缺省值,适用于字符,数字,日期等类型数据

* NVL2()函数用于实现条件表达式功能

* NULLIF()函数用于数据等价性比较并根据比较结果返回null或其中一个被比较的数值

- 依次考察各参数表达式,遇到非null值即停止并返回该值

* CASE()表达式用于实现多路分支结构

* CASE()表达式类似,DECODE()函数也用于实现多路分支结构

* 单行孙数可以嵌套使用, 嵌套层次无限制

* 嵌套函数的执行顺序是由内到外

* 使用系统提供的单行函数可实现如下功能:

- 控制数据的输出格式

- 设置/改变日期的显示格式

- 使用NVL函数处理空值

* 分组函数对一组数据进行运算,针对一组数据(多行记录)只返回一个结果,也称多行函数

* 分组函数省略列中的空值

* 可使用NVL()函数强制分组函数处理空值

* GROUP BY 子句将表中数据分成若干小组

- 出现在SELECT列表中的字段,如果不是包含在组函数中,那么该字段必须同时在 GROUP BY 子句中出现

- 可使用 where 子句限定查询条件

* 如果没有 GROUP BY 子句, SELECT 列表中不允许出现字段(单行函数)与分组函数混用的情况

* 不允许在 WHERE 子句中使用分组函数

- :这跟子句运行顺序有关,

* 分组函数最多可嵌套两层

* SQL/Oracle 使用表连接从多个表中查询数据

- where 子句中指定连接条件

- 当被连接的多个表中存在同名字段时,必须在该字段前加上"表名."作为前缀

* 提示:加上前缀可以提高效率

- 使用 On 子句建立连接

- 可使用 AND 操作符增加查询条件

- 使用表别名可以简化查询

- 使用表名(表别名)前缀可提高查询效率

- 为了连接 n 个表, 至少需要 n-1 个连接条件

* 问题:如何查得每个员工的工资等级

* 使用外连接可以看到参与连接的某一方不满足连接条件的记录

* 外连接运算符为(+)

* 传统的外连接分为左外连接和右外边接两种

* 左外连接'(+)'放在右边,将左表中不符合条件的也显示出来

* 右外连接'(+)'放在左边,将右表中不符合条件的也显示出来

* 问题:如何查得每个员工及其上司的工号和姓名

* SQL1999 规范中规定的连接查询语法

* Cross join产生了一个笛卡尔集,其效果等同于在两个表进行连接时未使用 WHERE 子句阴定连接条件

* Natural join 基于两个表中的全部同名列建立连接

- 从两个表中选出同名列的值均对应相等的所有行

- 如果两个表中同名列的数据类型不同,则出错

- 不允许在参照列上使用表名或者别名作为前缀

- 上面SQL语句等同于:

* 注意:第一种方法的deptno不能加上表名前缀,第二种方法必须加上表名前缀

* 如果不希望参照被连接表的所有同名列进行等值连接,自然连接将无法满足

* 要求,可以在连接时使用Using子句来设置用于等值连接的列(参照列).

* 不允许在参照列上使用表名或者别名作为前缀

* 如果要参照非同名的列进行等值连接,或想设置任意的连接条件,可以使用 ON 子句

- 上面SQL语句等同于:

- 上面SQL语句等同于:

* 使用SQL99连接语法,两个以上的表进行连接时应依次/分别指定相临的两个表之间的连接条件

- 上面SQL语句等同于:

- SQL99 规范中,内连接只返回满足连接条件的数据

- 两个表在连接过程中除返回满足连接条件的行以外,还返回左表中不满足条件的行,这种连接称为左外联接

- 两个表在连接过程中除返回满足连接条件的行以外,还返回右表中不满足条件的行,这种连接称为右外联接

- Oracle9i 开始新增功能,两个表在连接过程中除返回满足连接条件的行以外,还返回两个表中不满足条件的所有行,这种连接称为满外联接

* 将满足条件的和左表中不满足条件的还有右表中不满足条件的,都返回(满外联接(Full Outer Join))

- 如何查得所有比'张三'工资高的员工的信息

- 子查询在主查询前执行一次

- 主查询使用子查询的结果

* 在查询是基于未知值时应考虑使用子查询

* 子查询必须包含在括号内

* 建议将子查询放在比较运算符的右侧,以增强可读性

* 对单行子查询使用单行运算符

* 对多行子查询使用多行运算符

* 单行子查询只返回一行记录

* 对单行子查询可使用单行记录比较运算符

* 如果子查询未返回任何行,则主查询也不会返回任何结果

* 如果子查询返回单行结果,则为单行子查询,可以在主查询中对其使用相应的单行记录比较运算符

* 如果子查询返回多行结果,则为多行子查询,此时不允许对其使用单行记录比较运算符

* 多行子查询返回多行记录

* 对多行子查询只能使用多行记录比较运算符

- 删除不再需要的数据

* insert 语句用于向表中插入数据

- insert 语句每次只能向表中插入一条记录

- 缺省字段名列表时, 应为新插入记录中的每个字段设定新值

- 也可在 insert 语句中指定赋值字段列表, 中为部分字段显式设定新值, 其余字段将被缺省赋值为 null

* 可以在 insert 语句中使用子查询, 实现表间数据拷贝:

- 子查询中的值列表应与 insert 子句中的字段列表相对应

* update 语句用于更新表中数据

- update 语句每次可更新多条记录

- 可使用 where 子句限定要更新的记录, 如果缺省 where 子句, 则更新表中的所有记录

* delete 语句用于从表中删除数据

- delete 语句每次可删除多条记录

- 可使用 where 子句限定要删除的记录, 如果缺省 where 子句, 则删除表中的所有记录

* merge 语句用于进行数所合并--根据条件在表中执行数据的修改或插入操作,如果要插入的记录在目标表中已

* 经存在,则执行更新操作,否则执行插入操作

- 组成单个逻辑工作单元的一系列操作被称为事务

- 通过将一组相关操作组合为一个要么全部成功,要么全部失败的逻辑工作单元,以简

- 化错误恢复,提高应用程序的可靠性

* 事务开始于第一条可执行语句

- 显式的提交和回滚操作是为了更好地保证数据的一致性

- 下述情况下事务会被自动提交

- 会话异常终止/系统崩溃时事务会被自动回滚

* Sql Plus 中执行 SQL 语句时可以设置是否自动提交,缺省设置为非自动提交

* 当事务中数据状态的改变是可以恢复的

操作结果只对当前用户(会话)可见,其它用户(会话)看不到当前事务中数据状态的改变,直到当前事务结束

* 当前事务中 DML 语句所涉及到的行被锁定,其他用户(会话)不能对其进行修改操作

- 这时 会话窗口2 则无反映,因为该数据已被锁定,会话窗口1 commit 之后则可以对其进行操作,同样,

- 果 会话窗口2 没有对其 commit, 则该数据就被 会话窗口2 锁定.可以开 N 个会话窗口

- 登录的用户可以是同一个

- 每一个窗口就是一个会话

* 数据的修改永久生效,不可再撤销

* 数据以前的状态永久性丢失,无法恢复

* 所有的用户(会话)都将看到操作后的结果

* 记录锁被释放,其它用户可对这些进行修改操作

* 数据恢复到修改前的状态

* 通过保存点在当前的事务中创建标记,将来可回退到指定的标记(保存点),实现事务的部分回滚.

- 在保存点后面可以加上commit,数据被提交,则之前的保存点也丢失,不可以回退到commit之前设置的保

- 约束条件 存放数据的基本数据库对象,由行(记录)和列(字段组)

- 索引   根据表中指定的字段建立起来的顺序,用于提高查询性能

- 同一方案(用户)下的对象不能重名

- 创建表时必须指定表名, 字段名, 字段类型

* 在创建表的同时, 可以将子查询的结果直接插入其中:

- 新建表与子查询结果的字段列表必须匹配

- 新建表的字段列表可以缺省

- 如果子查询中有表达式,必须使用别名

* alter table 语句中, 使用 add 字句添加新字段, 新字段只能被加到整个表的最后

包括字段的数据类型,大小和默认值

- 修改操作会受到当前表中已有数据的影响--当已有记录的相应字段只包含空值时,类型,大小都可以修改,否则修改可能失败

- 修改的缺省值设置,只对此后新插入的记录有效

子句删除字段--从每行中删除掉该字段占据的长度和数据,释放在数据块中占用的存储空间

- DDL 语句, 一经执行不可撤销

- 表中所有数据将被删除

- 此前未完成的事务将被提交

- 所有相关的索引被删除

- DDL 语句, 一以执行不可撤销

* 使用 rename 语句可以改变现有表的名称

- 也可修改其他数据对象(视图,序列,同义司等)的名称

- 执行重命名操作的必须是对象的所有者

- DDL 语句, 一经执行不可撤销

- 用户自己创建并维护的一组表

- 包含了用户所需的信息

- Oracle 表据库自动创建并维护的一组表

- 数据字典是 Oracle 数据库的核心, 用于描述数据库及其所有对象

- 数据字典由一系列只读的表和视图组成, 这些表和视图属 sys 用户拥有, Oracle server 负责维护, 用户可以通过 select 语句进行访问

- 数据库的物理和逻辑结构

- 对象的定义和空间分配

* 数据字典视图可分为三类:

- dba - 所有方案包含的对象信息

- all - 用户可以访问的对象信息

* 查看当前用户拥有的所有表的名字;

* 查看当前用户可以访问的所有表的名字;

* 查看当前用户拥有的所有对象的类型

* 查看所有用户拥有的所有对象的类型

* 查看当前用户拥有的权限

* 约束 ( Constraint ) 是在表上强制执行的数据校验规则,用于保护数据的完整性,具体包抱如下五种:

- 可以在表级或列级定义约束

- 可以通过数据字典视图查看约束

- 确保字段值不能为空(null)

- 唯一性约束用于确保所在的字段(或字段组合)不出现重复值

- 唯一性约束的字段允许出现空值

- Oracle 会自动为唯一性约束创建对应的唯一性索引

- 唯一性约束既可以在字段级定义,也可以在表级定义

- 主键用于唯一标识表中的某一行记录,功能上相当非空且唯一

- 一个表中只允许一个主键,主键可以是单个字段或多字段的组合

- Oracle 会自动为主键字段创建对应的唯一性索引

- 主键约束既可以在字段级定义,可以在表级定义

- 由多个字段组合而成的主键也称联合主键

- 联合主键中每一个字段都不能为空

- 联合主键字段组合的值不能出现重复

- 联合主键只能定义为表级约束

- 外键用于确保相关的两个字段之间的参照关系,以实现参照完整性约束

- 外键约束通常构建于来自不同表的两个字段之间;

- 子表外键列的值必须在主表参照列值的范围内,或者为空

- 外键参照的必须是主表的主键或者唯一键

- 主表主键/唯一键被子表参照时,主表相应记录不允许被删除

- 定义每一行(的指定字段)都必须满足的条件

- 以条件表达式的形式给出数据需要符合的条件

- 条件表达式中不允许出现如下内容:

* 上述5种约束分为三类:

- 可得到用户的所有约束

- 可获知约束建立在哪些字段上

* 删除主键约束的另一种方式(只有主键才可以这样删,因为主键只有一个):

* 在删除约束时,如果还存在与该当前约束相关联的其它约束,则删除操作会失败,此时可使用 cascade 子句将其它关联约束一并删除

在删除表中字段时,如果该字段处于多字段联合约束条件(联合主键,联合唯一键,存在参照当前字段的外键),则删除会失败,此时可

* 也可使用 cascade 选项将相关联的约束也一并禁用

- 和关闭约束操作的情形有所不同,此时无法再使用 cascade 选项一并启用相关联的其它约束

- 视图由一个或多个表(或视图)中提取数据而成

- 视图一经创建,可以当作表来使用

- 屏蔽数据库表结构,实现数据逻辑独立性

- 在相同数据上提供不同的视图,便于数据共享

* 简单视图和复杂视图

- 通过在 create view 语句中嵌入子查询的方式创建视图

* 可使用 force 选项强制创建视图

* 在可更新视图上进行 DML 操作,可以修改基表中数据

字段的定义不能为表达式..

- 由两个以上基表中导出的视图不可更新

- 基表中非空的列在视图定义中未包括,则不可在视图上进行 insert 操作...

* 在视图上进行 DML 操作,语法与在表上操作相同

* 嵌入到 SQL 语句中的子查询是临时视图

* 临时视图不是数据库对象, 其定义不会长久保存在数据库中,本次运行后即被清除

- 一种用于提升查询效率的数据库对象

- 通过快速定位数据的方法, 减少磁盘 I/O 操作;

- 索引信息与表独立存放;

- Oracle 数据库自动使用和维护索引

* 创建索引的两种方式

- 自动创建:在定义主键或唯一键约束时系统自动在相应的字段上创建唯一性索引

- 手动创建:用户可以在其它列上创建非唯一的索引,以加速查询

- 操作者须是索引的所有者, 或拥有 drop index 的权限

- 删除表时相关的索引(和约束将被自动删除), 但视图和序列将保留

* 下述情况可以创建索引

- 字段取值分布范围很广

- 字段中包含大量空值

- 字段经常出现在 where 子句或连接条件中

- 表经常被访问, 数据量很大, 且通常每次访问的数据量小于记录总量的2%-4%

* 下列情况不适合创建索引

- 字段不经常出现在 where 子句中

- 每次访问的数据量大于记录总数据的2%-4%

- 被索引的字段作为表达式的一部分被引用

- 可得到用户的所有索引

- 可获知索引建立在哪些字段上

* 基于表达式的索引被统称为基于函数的索引--索引表达式由表中的字段, 常量, SQL 函数和自定义函数构建而成

- 系统自动生成的,不重复的整数据值,

- 序列是一种数据库对象,可以被多个用户共享

- 贡型用途是做为主键值,它对于每一行必须是唯一的

- 序列可以代替应用程序编号

- 可以对序列值进行缓冲存储,以提高访问效率

- nextval 伪列用于从指定的序数值中取出下一个值

- currval 伪列引用的是指定序列的"当前值"

- 序列在下列情况下可能出现不连续的情况:

- 多个表同时使用同一个序列

- 操作者必须是序列的所有者,或者拥有 alter 该序列的权限

- 只有未来再生成的序列数受影响

- 序列的初始值不可更改

- 更改中会进行一些难,比如新的 maxvalue 如果小于当前的序列值就会报错

- 操作者必须是序列的所有者,或者拥有 drop sequence 的权限

* 同义词相当于对象的别名, 使用同义词可以:

- 方便访问其它用户的对象

- 缩短对象名字的长度

}

我要回帖

更多关于 oracle数据库 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。