Oracle数据库

本文围绕Oracle数据库展开,介绍了SQL基础,涵盖各类语句及约束;阐述PL/SQL语言特点、优势与结构;讲解游标、视图、存储过程、触发器的概念与作用;还说明了事务和锁的相关知识,以及控制文件、日志文件、表空间和备份恢复等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Oracle数据库

第1章 SQL基础

第2章 PL/SQL

第3章 游标

第4章 视图

第5章 存储过程

第6章 触发器

第7章 事务和锁

第8章 其他


第1章 SQL基础

1.SQL种类

1)数据定义语言(DDL)

数据定义语言(Data Definition Language,DDL)是定义数据库中数据要如何存储的。DDL语言包括对数据库中对象的创建、修改、删除的操作,这些对象主要有数据库、数据表、视图、索引等。

  1. 数据操纵语言(DML)

数据操纵语言(Data Manipulation Language,DML)是对数据库表进行操作的。这些操作主要包括对数据库表中的数据进行增加、删除、修改的操作,并且在操作时一次可以把表中数据按条件进行多条或全部的处理,为数据库的使用提供方便。

  1. 数据查询语言(DQL)

数据查询语言(Data Query Language,DQL)是对数据库表中的数据进行查询的,查询时既可以查询一个表也可以进行多表的查询,并且可以按不同的条件来检索数据,给数据库的查询统计工作带来了更多的便利。

  1. 数据控制语言(DCL)

数据控制语言(Data Control Language,DCL)是对数据库中的对象权限进行权限设置和取消等操作,但是只有数据库的系统管理员才有权力去执行对数据库对象权限的操作。使用DCL可以为数据库中不同的用户设置不同的权限,这样也能够提高数据库的安全性。

2.数据定义语言(DDL)

DDL主要包括数据库对象的创建(create)、删除(drop)和修改(alter)的操作。

CREATE语法:

CREATE TABLE table_name
(
column_name datatype[null|not null],
column_name datatype[null|not null],
...
[constraint]
)
 
 
❑table_name:在数据库中创建的数据表的名称,在一个数据库中数据表名是不能重复的。

❑column_name:表中的列名,列名在一个表中也是不能重复的。

❑datatype:该列存放数据的数据类型。

❑[null|not null]:允许该列为空或者不允许该列为空,在创建表时默认为不允许该列为空。

❑[constraint]:为表中的列设置约束,约束主要包括主键约束、外键约束、检查约束等。

ALTER语法:

ALTER TABLE table_name
ADD column_name|MODIFY column_name|DROP COLUMN column_name;  

❑ADD:用于向表中添加列。

❑MODIFY:用来修改表中已经存在的列的信息。

❑DROP COLUMN:删除表中的列,在删除表中的列时经常要加上CASCADE CONSTRAINTS,是要把与该列有关的约束也一并删除掉。

DROP语法:

DROP TABLE table_name;
3.数据操纵语言(DML)

INSERT语法:

INSERT INTO 
    table_name(column_name1,column_name2,...)
VALUES(data1,data2...);


❑column_name1:指定表中要添加数据的列名,可以是1个到多个。

❑data1:要填入指定列的数据值,这里要求添加值的数目要与列名的数量一致。

UPDATE语法:

UPDATE table_name 
SET column_name1=data1,column_name1=data2,...
[WHERE condition];


❑column_name1:要修改数据列的字段名,可以是一个或多个。

❑data1:要赋给字段的新值,这个值的数据类型要与数据表中字段的数据类型一致。

❑WHERE:条件,这里如果省略了WHERE语句,那么就意味着要修改表中该字段的所有值,如果加上WHERE语句,那么就可以有选择地修改数据表中的某个字段。

DELETE语法:

DELETE FROM table_name[WHERE condition]; 

其中,[WHERE condition]子句是可以省略的,如果省略了[WHERE condition]子句,
就意味着删除数据表中全部的数据,如果加上了[WHERE condition]子句就可以根据条件删除表中的数据。
这里,删除数据都是指删除数据表中一条记录并不是删除表中某个字段。
4. 数据查询语言(DQL)

SELECT语法:

SELECT column_name1,column_name2,...
FROM table_name 
WHERE[condition]; 

❑column_name1:代表的是数据表中的字段名,可以查询数据表中的一个或多个字段,同时可以使用“*”号代替数据表中所有的字段。

❑WHERE[condition]:代表的是查询的条件,如果不指定查询条件则查询数据表中所有的记录;如果指定查询条件,那么就可以根据查询条件来查询记录了。
5. 数据控制语言(DCL)

数据控制离不开数据库的使用者,数据控制语言主要就是对数据库使用者赋予和撤销访问数据库的权限的设置,主要包括授予权限要使用的语句GRANT和收回权限的语句REVOKE。

6. 其他数据操纵语句

(1)TRUNCATE语句

TRUNCATE语句和DELETE语句一样都是用来完成删除数据表中数据的,但是二者是有区别的。使用TRUNCATE语句删除表中的记录都是要把表中的记录全部删除,但是TRUNCATE语句删除表中数据的速度要比使用DELETE语句删除表中的数据更快一点。

具体语法如下:

TRUNCATE TABLE table_name;

(2)MERGE语句

MERGE语句与UPDATE语句的功能类似,都是修改数据表中数据的,但是MERGE语句与UPDATE语句也是有区别的。使用MERGE语句可以对数据表同时进行增加和修改的操作。

具体语法如下:

MERGE[INTO]table_name1
USING table_name2
ON(condition)
WHEN MATCHED THEN merge_update_clause
WHEN NOT MATCHED THEN merge_insert_clause;
【语法说明】

❑table_name1:要修改或添加的表。

❑table_name2:参照的更新的表。

❑condition:table_name1和table_name2之间的关系,或其他的一些条件。

❑merge_update_clause:如果和参照表table_name2中的条件匹配,就执行更新操作的SQL语句。

❑merge_insert_clause:如果条件不匹配,就执行增加操作的SQL语句。
7. 约束

约束是保证数据库表中数据的完整性和一致性的手段。Oracle 11g的5个约束,即主键约束、外键约束、唯一约束、检查约束、非空约束。

7.1 主键约束

主键约束在每一个数据表中只有一个,但是一个主键约束可以由数据表中多个列组成。

添加主键:
ALTER TABLE table_name
ADD CONSTRAINTS constraint_name PRIMARY KEY(column_name);
【语法说明】

❑constraint_name:约束的名称。

❑column_name:主键约束指定数据表中的列名。

移除主键:
ALTER TABLE table_name
DROP CONSTRAINT constraint_name;
【语法说明】

constraint_name:要移除的约束名称,这个名称可以是在表中任意约束的名称。
7.2 外键约束

外键约束可以保证使用外键约束的数据库列与所引用的主键约束的数据列一致,外键约束在一个数据表中可以有多个。

添加外键:
CONSTRAINT constraint_name FOREIGN KEY(column_name)
REFERENCE table_name(column_name)
ON DELETE CASCADE;
【语法说明】

❑constraint_name:创建的外键约束名字。

❑FOREIGN KEY(column_name):指定外键约束的列名。

❑REFERENCE:要引用的表名(列名)。

❑ON DELETE CASCADE:设置级联删除,当主键的字段被删除时,外键所对应的字段也被同时删除。

移除外键:
ALTER TABLE productinfo1
DROP CONSTRAINT fk_pro;
7.3 CHECK约束

CHECK约束是检查约束,能够规定每一个列能够输入的值,以保证数据的正确性。

添加:
CONSTRAINT constraint_name CHECK(condition); 

condition是检查约束的条件,检查约束的条件要建立在具体的字段中。 

移除:
LTER TABLE custominfo
DROP CONSTRAINT chk_gender;
7.4 UNIQUE约束

UNIQUE约束称为唯一约束,可以设置在表中输入的字段值都是唯一的,这个约束和之前学习的主键约束非常相似。不同的就是唯一约束在一个表中可以有多个,而主键约束在一个表中只能有一个。

添加:
CONSTRAINT constraint_name UNIQUE(column_name); 

移除:
ALTER TABLE orderinfo
DROP CONSTAINT unq_customid;
7.5 NOT NULL约束

NOT NULL约束就是非空约束,经常会在创建表时添加非空约束以确保字段必须要输入值。该约束和之前的约束不同,是直接在创建列时设置字段的非空约束。

修改:
ALTER TABLE table_name
MODIFY column NOT NULL;

第2章 PL/SQL

1. 简介

PL/SQL(Procedural Language/Structured Query Language)是Oracle公司在标准SQL语言基础上进行扩展而形成的一种可以在数据库上进行设计编程的语言,通过Oracle的PL/SQL引擎执行。PL/SQL完全可以像Java语言一样实现逻辑判断、条件循环以及异常处理等,这是标准的SQL很难办到的事情。

PL/SQL有以下几个特点:

❑支持事务控制和SQL数据操作命令。

❑它支持SQL的所有数据类型,并且在此基础上扩展了新的数据类型,也支持SQL的函数以及运算符。

❑PL/SQL可以存储在Oracle服务器中。

❑服务器上的PL/SQL程序可以使用权限进行控制。

❑Oracle有自己的DBMS包,可以处理数据的控制和定义命令。

2. PL/SQL的优势

(1)可以提高程序的运行性能

标准的SQL被执行时,只能一条一条地向Oracle服务器发送。PL/SQL的语句块可以包含多条SQL语句,而语句块可以嵌入到程序中,甚至可以存储到Oracle服务器上。样用户只需要连接一次数据库就可以把需要的参数传递过去,其他的部分将在Oracle服务器内部执行完成,然后返回最终的结果。这样就大大地节省了网络资源的开销。

(2)可以使程序模块化

在程序块中可以实现一个或几个功能。用块也可以把数据库数据同客户程序隔离开来,使得数据库表结构发生变化时,对调用者的影响减小到最低程度。

(3)可以采用逻辑控制语句来控制程序结构

如果一个PL/SQL程序块中只能顺序地执行基本的SQL语句,那么它的意义实在有限。而实际当中PL/SQL可以利用条件或循环语句来控制程序的流程,这么做就大大地增加了PL/SQL的实用性,我们可以利用逻辑控制语句完成复杂的普通SQL语句完成不了的业务。

(4)利用处理运行时的错误信息

标准的SQL在遇到错误时会提示异常。利用PL/SQL还可以处理一些程序上的异常,不至于因终止SQL操作,而造成调用SQL的展示页面出现生硬的错误提示。

(5)良好的可移植性

PL/SQL可以成功地运行到不同的服务器中。

3. PL/SQL的结构

PL/SQL程序的基本单位是块(block),而PL/SQL块很明确地分三部分,其中包括声明部分、执行部分和异常处理部分。其中,声明部分以DECLARE作为开始标志,执行部分用BEGIN作为开始标志,而异常处理部分则以EXCEPTION为开始标志。其中的执行部分是必需的,而其余的两个部分则可选。下面的一段文字描述了PL/SQL块的三部分:

[DECLARE]--声明开始关键字
/*这里是声明部分,包括PL/SQL中的变量、常量以及类型等*/
BEGIN--执行部分开始的标志
/*这里是执行部分,是整个PL/SQL块的主体部分,该部分在PL/SQL块中必须存在,可以是SQL语句或者程序流程控制语句等*/
[EXCEPTION]--异常开始部分的关键字
/*这里是异常处理部分,当出现异常时程序流程可以进入此处*/
END;--执行结束标志

第3章 游标

1. 游标

游标的使用可以让用户像操作数组一样操作查询出来的数据集,这使得使用PL/SQL编程更加方便。实际上,它提供了一种从集合性质的结果中提取单条记录的手段。
可以将游标(Cursor)形象地看成一个变动的光标。它实际上是一个指针,它在一段Oracle存放数据查询结果集或数据操作结果集的内存中,这个指针可以指向结果集中的任何一条记录。这样就可以得到它所指向的数据了,但初始时它指向首记录。这种模型很像编程语言中的数组。

可以简单地理解游标为指向结果集记录的指针,利用游标可以返回它当前指向的行记录(只能返回一行记录)。如果要返回多行,那么需要不断地滚动游标,把想要的数据查询一遍。用户可以操作游标所在位置行的记录。

2. 游标的种类

Oracle中游标分为静态游标和REF游标两类。其中,静态游标就像一个数据快照,打开游标后的结果集是对数据库数据的一个备份,数据不随着对表执行DML操作后而改变。

静态游标包含如下两种类型:

❑显式游标:是指在使用之前必须有着明确的游标声明和定义,这样的游标定义会关联数据查询语句,通常会返回一行或多行。打开游标后,用户可以利用游标的位置对结果集进行检索,使之返回单一的行记录,用户可以操作此记录。关闭游标后,就不能再对结果集进行任何操作。显式游标需要用户自己写代码完成,一切由用户控制。

❑隐式游标:和显式游标不同,它被PL/SQL自动管理,也被称为SQL游标。由Oracle自动管理。该游标用户无法控制,但能得到它的属性信息。

2.1 游标语法
CURSOR cursor_name
[(parameter_name datatype,...)]
IS select_statement;
【语法说明】

❑CURSOR cursor_name:声明游标,cursor_name是游标的名称。

❑parameter_name:参数名称。

❑datatype:参数类型。

❑select_statement:游标关联的SELECT语句,但该语句不能是SELECT...INTO...语句。
2.2 游标的使用步骤

显式游标的使用顺序可以明确地分成声明游标、打开游标、读取数据和关闭游标4个步骤。

(1)声明游标

声明游标主要用来给游标命名并且使得游标关联一个查询。具体语句如下:

DECLARE CURSOR cursor_Name
IS SELECT_STATEMENT
(2)打开游标

游标中任何对数据的操作都是建立在游标被打开的前提下。打开游标初始化了游标指针,游标一旦打开,其结果集都是静态的。也就是说,结果集此时不会反映出数据库中对数据进行的增加、删除、修改操作。具体语句如下:

OPEN cursor_Name
(3)读取数据

读取数据要利用FETCH语句完成,它可以把游标指向位置的记录放入到PL/SQL声明的变量当中。它只能取出指针当前行的记录。正常情况下,FETCH要和循环语句一起使用,这样指针会不断前进,直到某个条件不符合要求而退出。使用FETCH时游标属性%ROWCOUNT会不断累加。具体语句如下:

FETCH cursor_Name INTO Record_Name
(4)关闭游标

关闭某个名称的游标。此时释放资源,结果集中的数据将不能做任何操作。具体语句如下:

CLOSE cursor_Name
2.3 显式游标的属性

利用游标属性可以得到游标执行的相关信息。显式游标有以下4个属性:

❑%ISOPEN:用于判断游标是否打开,如果已经打开则返回TRUE,如果游标未打开则返回FALSE。

❑%FOUND:此属性可用来检测行数据是否有效。如果有效该属性返回TRUE,否则返回FALSE。

❑%NOTFOUND:与%FOUND属性恰好相反,如果没有提取出数据则返回TRUE,否则返回FALSE。

❑%ROWCOUNT:累计到当前为止使用FETCH提取数据的行数。

3. 隐式游标

每当运行SELECT或DML语句时,PL/SQL会打开一个隐式的游标。隐式游标不受用户的控制,这一点和显式游标有明显的不同。下面列出了隐式游标和显式游标的不同处:

❑隐式游标由PL/SQL自动管理;

❑隐式游标的默认名称是SQL;

❑SELECT或DML操作产生隐式游标;

❑隐式游标的属性值始终是最新执行的SQL语句的。

第4章 视图

1. 视图概念

根据官方的文档可以这样理解视图:它是一个基于一个表或多个表的逻辑表,视图本身不包含任何数据。通俗来说,可以把视图看成是虚拟的表,只是一个查询语句的结果,它的数据最终是从表中获取的,这些表通常称为源表或基表。当基表的数据发生变化时,视图里的数据同样发生变化。通常视图的数据源有下面三种情况:

❑单一表的子集。

❑多表操作结果集。

❑视图的子集。

2. 视图的作用

❑使数据简化。
在表中很多数据对业务来说是冗余的,这时开发者会使用比较复杂的SQL语句得到自己想要的。实际开发中不能要求每个人都能做到这一点,所以,通常情况下由一个人把该复杂语句做成视图,其他人员直接调用该视图即可。这样对视图使用人员就简化了数据,隐藏了数据的复杂性。

❑使数据更加独立。
程序开发时,大多数是程序直接访问数据库的表,当这些表的结构随着业务的变化而不得不重新设计时会影响到程序(通常表一旦设计完成就很难再做修改),所以可以使得程序直接访问视图。这样视图就可以把程序和数据库的表隔离开来,降低开发者的劳动成本。

❑增加安全性。
视图可以查询表指定的列来展现给用户,而不必让使用者完全看见表的所有字段。这种情况很多是一个公司提供给其他合作伙伴查询数据的接口,而视图通常也会设成只读属性。

第5章 存储过程

1. 概念

谓存储过程,就是一段存储在数据库中执行某种功能的程序,其中包含一条或多条SQL语句,但是它的定义方式和PL/SQL中的块、包等有所区别。存储过程可以通俗地理解为是存储在数据库服务器中的封装了一段或多段SQL语句的PL/SQL代码块。在数据库中有一些是系统默认的存储过程,那么可以直接通过存储过程的名称进行调用。另外,存储过程还可以在编程语言中调用,如Java、C#、VB等编程语言。

2. 存储过程的作用

❑简化复杂的操作。
存储过程可以把需要执行的多条SQL语句封装到一个独立单元中,用户只需调用这个单元就能达到目的。这样就实现了一人编写多人调用,同时缩短了平均开发周期,为公司节省了成本。

❑增加数据独立性。
与视图的效果类似,利用存储过程可以把数据库基础数据和程序(或用户)隔离开来,当基础数据的结构发生变化时,可以修改存储过程,这样对程序来说基础数据的变化是不可见的,也就不需要修改程序代码了。

❑提高安全性。
使用存储过程有效地降低了错误出现的几率。如果不使用存储过程要想实现某项操作可能需要执行多条单独的SQL语句,而过多的执行步骤很可能造成更高的出错几率。不仅如此,实际工作中开发人员的水平参差不齐,由高水平的人编写存储过程,水平较低的人员直接调用,这样就能避免很多不必要的错误发生。此外,存储过程也可以进行权限设置。

❑提高性能。
完成一项复杂的功能可能需要多条SQL语句,同时SQL每次执行都需要编译,而存储过程可以包含多条SQL语句,而且创建完成后只需要编译一次,以后就可以直接调用,从这方面来看存储过程可以提高性能。如果程序语言要实现某项比较复杂的功能,它会多次连接数据库,在使用存储过程的情况下,程序只需连接一次就能达到目的。

3. 存储过程的语法
CREATE[OR REPLACE]PROCEDURE[schema.]procedure_name
[parameter_name[[IN]datatype[{:=|DEFAULT}expression]
|{OUT|IN OUT}[NOCOPY]datatype
][,...]
{IS|AS}
BODY;
其中各项参数介绍如下:

❑OR REPLACE:表示如果指定的过程已经存在,则覆盖同名的存储过程。

❑schema:表示该存储过程的所属机构。

❑procedure_name:创建存储过程的名称。

❑parameter_name:表示存储过程中的参数名称。

❑[IN]datatype[{:=|DEFAULT}expression]:整个这段语法表示传入参数的数据类型以及默认值。其中,datatype项表示参数的数据类型,[{:=|DEFAULT}expression]项表示参数的默认值的写法。

❑{OUT|IN OUT}[NOCOPY]datatype:表示存储过程的参数类型,不过和上面介绍的IN有所区别。其中,OUT表示输出参数,IN OUT表示既可输入也可输出的参数,datatype依旧表示参数类型。

❑{IS|AS}:连接词。

❑BODY:表示函数体,是存储过程的具体操作部分,通常在begin...end中。

注意 存储过程的参数默认类型是IN型的,也就是说是传入型的。当前模式下创建存储过程需要有CREATE PROCEDURE权限。

第6章 触发器

1. 触发器的作用

触发器可以根据不同的事件进行调用,它有着更加精细的控制能力,这种特性可以帮助开发人员完成很多普通PL/SQL语句完成不了的功能。下面介绍一下触发器的主要作用。

❑自动生成自增长字段。
例如,在表中插入数据前得到序列的最大值和数据同时插入表中,避免该序列的重复。

❑执行更复杂的业务逻辑。
普通的操作方式只能完成固定的数据变动,而使用触发器则在完成的基础功能上做额外的操作,以达到完成特殊业务的目的。

❑防止无意义的数据操作。
利用触发器可以把符合某些条件的数据加以限制,使其不能变动。

❑提供审计。
利用触发器可以跟踪对数据库的操作,也可以在指定的表或视图记录改变时,利用触发器把数据变动日志记录下来。

❑允许或限制修改某些表。
利用触发器可以限制表的变动。

❑实现完整性规则。
当一个表中的数据有变动时可以利用触发器修改这些变动数据在其他表中的关联数据(正常情况下可以利用外键进行限制)。

❑保证数据的同步复制。

2. 触发器的类型

触发器可分为5种类型,具体内容如下:

❑数据操纵语言(DML)触发器。
此种类型触发器定义到表上,当对表执行INSERT、UPDATE、DELETE操作时可以激发该类型的触发器。利用该类触发器可以复制、检查、替换某种符合指定条件的数据。按照触发级别可以分为两种方式,第一种为行级触发器,此种类型表示每条记录修改时都会激发该触发器;第二种为语句级触发器,此种类型表示当SQL语句执行时会激发该触发器,与修改多少条记录没有关系。如果以数据的更改事件为准,则分为BEFORE和AFTER两种类型。

❑数据定义语言(DDL)触发器。
当CREATE、ALTER、DROP模式对象时会触发相关的触发器,在Oracle中可以简单地理解一个用户就有一个和它同名的模式,利用它可以使得某些表不能被修改或删除。

❑复合触发器。
此种类型的触发器是Oracle 11g的新特性,它相当于在一个触发器中包含了4种类型的触发器,其中包含了BEFORE类型的语句级、BEFORE类型的行级、AFTER类型的语句级、AFTER类型的行级。这种把所有触发器都放到一个代码块中的做法使得变量的传递变得更加方便。

❑INSTEAD OF触发器。
此种类型触发器通常作用在视图上。对由多个源表的视图做DML操作通常是不被允许的,如果遇到这种情况就可以利用INSTEAD OF类型触发器解决问题。利用它可以把对视图的DML操作转换成对多个源表进行操作。

❑用户和系统事件触发器。
作用在数据库上由数据库事件激发的触发器,如登录和注销事件的触发器。利用它可以记录数据库的登录情况。

3. 触发器执行顺序

在同一对象上可以作用多个触发器,因此触发器被激发的顺序是有先后关系的。其触发顺序如下:

1)首先被触发的将是前语句级触发器(before statement trigger),该触发器会被执行一次。

2)如果有行级的触发器则接下来执行前行级触发器(before row trigger),行级触发器执行的次数同SQL修改的记录次数一致。

3)当SQL修改记录完成后会触发行级触发器,这时候的行级触发器为后行级触发器(after row trigger),该类型触发的次数同SQL修改记录的次数一致。

4)执行一次语句级的触发器,此时的语句级触发器为后语句级触发器(after statement trigger)。

如果多个相同类型的,相同事件触发器作用在同一个对象上,如果在Oracle 11g之前,那么最终被执行的会有一定的随机性,而在Oracle 11g中利用FOLLOWS可以控制其顺序。

第7章 事务和锁

事务和锁是两个联系非常紧密的概念,它们保证了数据库的一致性。由于数据库是一个可以由多个用户共享的资源,因此当多个用户并发地存取数据时,就要保证数据的准确性。

1. 什么是事务

事务在数据库中主要用于保证数据的一致性,防止出现错误数据。在事务内的语句都会被看成一个单元,一旦有一个失败,那么所有的都会失败。

事务就是一组包含一条或多条语句的逻辑单元,每个事务都是一个原子单位,在事务中的语句被作为一个整体,要么一起被提交,作用在数据库上,使数据库数据永久的修改;要么一起被撤销,对数据库不做任何的修改。

事务在没有提交之前可以回滚,而且在提交前当前用户可以查看已经修改的数据,但其他用户查看不到该数据,一旦事务提交就不能再撤销修改了。Oracle的事务基本控制语句有如下几个:

❑SET TRANSACTION:设置事务的属性。

❑COMMIT:提交事务。

❑SAVEPOINT:设置保存点。

❑ROLLBACK:回滚事务。

❑ROLLBACK TO SAVEPOINT:回滚至保存点。

2. 事务的类型

事务分为如下两种类型。

(1)显式方式

所谓的“显式方式”,就是利用命令完成。语法如下:

01 新事务开始
02 sql statement
03 ...
04 COMMIT|ROLLBACK;

(2)隐式方式

该类型的事务没有明确的开始和结束标志。它由数据库自动开启,当一个程序正常结束或使用DDL语言时会自动提交,而操作失败时也会自动回滚。如果设置AUTOCOMMIT为打开状态(默认关闭),则每次执行DML操作都会自动提交。命令语法如下:

SET AUTOCOMMIT ON/OFF
事务在什么条件下结束读者需要注意,否则有丢失数据的可能。当有下列情况之一时,事务会结束:

❑使用COMMIT事务提交,ROLLBACK事务回滚。

❑执行DDL语句,事务自动提交。例如,使用CREATE、DROP、GRANT、REVOKE等命令。

❑正常退出SQL*Plus时自动提交事务,非正常退出则ROLLBACK事务回滚。

3. 事务的ACID特性

事务有4个特性,它们分别是原子性、一致性、分离性、持久性。

1)原子性:事务的原子性是指,事务中程序是数据库的逻辑工作单位,它对数据的修改要么全部执行,要么完全不执行。原子也意味着不可分割,不管有多少程序,只要在同一个事务中,那么它们就是一个整体,如果都执行成功才意味着该事务成功,而有一个操作失败,那么同一个事务中的其他操作即使执行成功也没有用,事务会使其全部撤销。

2)一致性:事务的一致性指事务执行的前后数据库都必须处于一致性状态,它是相对脏读而言的。只有在事务完成后才能被所有使用者看见,保证了数据的完整性。例如在银行转账时,从A账户取款但没有放到B账户中时数据是不一致的,同时也是不完整的,其他使用者此时不能看到A中修改后的数据,只有存到B账户中,交易完成并提交事务,这时才算数据一致,所有用户也会看到修改后的数据。

3)分离性:分离性是指并发事务之间不能相互的干扰。也就是说,一个事务操作的数据不会被其他事务看到和操作。

4)持久性:持久性是指一旦事务提交完成,那么这将是对数据永久的修改,即使被修改后的数据遭到破坏,也不会出现回到修改之前的情况。

4. 锁

锁出现在数据共享的环境中,它是一种机制,在访问相同资源时,可以防止事务之间的破坏性交互。

事务的分离性要求当前事务不能影响其他的事务,所以当多个会话访问相同的资源时,数据库系统会利用锁确保它们像队列一样依次进行。Oracle处理数据时用到的锁是自动获取的,我们不用对此有过多的关注,但Oracle允许我们手动锁定数据。

Oracle的锁保证了数据的完整性。

5. 锁的分类

Oracle中分为两种模式的锁,一种是排他锁(X锁),另一种是共享锁(S锁)。

❑排他锁也可以叫写锁。这种模式的锁防止资源的共享,用做数据的修改。假如有事务T给数据A加上该锁,那么其他的事务将不能对A加任何的锁,所以此时只允许T对该数据进行读取和修改,直到事务完成将该类型的锁释放为止。

❑共享锁也可以叫读锁。该模式锁下的数据只能被读取,不能被修改。如果有事务T给数据A加上共享锁后,那么其他事务不能对其加排他锁,只能加共享锁。加了该锁的数据可以被并发地读取。

锁是实现并发的主要手段,在数据库中应用频繁,但很多都由数据库自动管理,当事务提交后会自动释放锁。

6. 锁的类型

Oracle为了使数据库实现高度的并发访问,它使用了不同类型的锁来管理并发会话对数据对象的操作。Oracle的锁按作用对象不同分为如下几种类型。

❑DML锁:该类型的锁被称为数据锁,用于保护数据。

❑DDL锁:可以保护模式中对象的结构。

❑内部闩锁:保护数据库的内部结构,完全自动调用。

其中,DML锁主要保证了并发访问时数据的完整性。如果再细分,它又可以分为如下两种类型的锁:

1)行级锁(TX),也可以称为事务锁。当修改表中某行记录时,需要对将要修改的记录加行级锁,防止两个事务同时修改相同记录,事务结束,该锁也会释放,是粒度最细的锁。该锁只能属于排他锁(X锁)。

2)表级锁(TM),主要作用是防止在修改表的数据时,表的结构发生变化。例如,会话S在修改表A的数据时它会得到表A的TM锁,而此时将不允许其他会话对该表进行变更或删除操作。

表级锁包含如下几种模式:

❑ROW SHARE,行级共享锁(RS)。该模式下不允许其他的并行会话对同一张表使用排他锁,但允许其利用DML语句或lock命令锁定同一张表中的其他记录。SELECT…FROM FOR UPDATE语句就是给记录加上了RS锁。

❑ROW EXCLUSIVE,行级排他锁(RX)。该模式下允许并行会话对同一张表的其他数据进行修改,但不允许并行会话对同一张表使用排他锁。

❑SHARE,共享锁(S)。该模式下,不允许会话更新表,但允许对表添加RS锁。

❑SHARE ROW EXCLUSIVE,共享行级排他锁(SRX)。该模式下,不能对同一张表进行DML操作,也不能添加S锁。

❑EXCLUSIVE,排他锁(X)。该模式下,其他的并行会话不能对表进行DML和DDL操作,该表只能读。

DDL锁也可以称为数据字典锁,主要作用是保护模式中对象的结构。当执行DDL操作时,首先Oracle会自动地隐式提交一次事务,然后自动地给处理对象加上锁;当DDL结束时,Oracle会隐式地提交事务并释放DDL锁。与DML不同的是,用户不能显式地要求使用DDL锁。

DDL锁分为如下3类:

❑Exclusive DDL Lock,排他DDL锁定。如果对象加上了该类型的锁,那么对象不能被其他会话修改,而且该对象也不能再增加其他类型的DDL锁。如果是表,此时可以读取数据。

❑Shared DDL Lock,共享DDL锁定。保护对象的结构,其他会话不能修改该对象的结构,但是允许修改数据。

❑Breakable Parsed Lock,能打破的解析锁定。该类型的锁可以被打断,不能禁止DDL操作。

第8章 其他

1. 控制文件与日志文件

控制文件和日志文件是数据库中两个主要的文件,没有控制文件数据库就无法启动,没有日志文件数据库的信息就无法完全恢复。

1.1 控制文件

控制文件是数据库中的一个二进制文件,它主要用来记录数据库的名字、数据库的数据文件存放的位置等信息。

每个数据库都存在控制文件,但是一个控制文件只属于一个数据库。这就像每个人都有身份证,但是一个身份证只属于一个人。控制文件在创建数据库时自动被创建,当数据库的信息发生改变时,控制文件也随之被改变;控制文件不能手动修改,只能由Oracle数据库本身自己来修改。控制文件在数据库启动和关闭时都要使用,如果没有控制文件,数据库将无法工作。

使用下面的语句就可在数据字典中查看控制文件的信息:

desc v$controlfile

1.2 日志文件

日志文件在Oralce数据库中分为重做日志文件和归档日志文件两种。其中,重做日志文件是Oracle数据库正常运行不可缺少的文件。重做日志文件(Redo Log File)主要记录了数据库操作的过程。在需要恢复数据库时,重做日志文件可以将日志从备份还原的数据库上再执行一遍,以达到数据库的最新状态。

Oracle系统在运行时有归档模式和非归档模式两种模式。在非归档模式下,所有的日志文件都写在重做日志文件中,如果重做日志文件写满了,那么就把前面的日志文件覆盖了。例如,一共有a、b、c三个日志文件,在非归档模式下,如果a文件写满了,就开始写b文件,如果b文件也写满了,就开始写c文件,如果三个文件都写满了,就把a文件中的内容覆盖掉重新写入。在归档模式下,如果重做日志文件全部写满后,就把第一个重做日志文件写入归档日志文件中,再把日志写到第一个重做日志文件中,使用归档日志的方式就可以方便以后做恢复操作。

使用下面的语句就可在数据字典中查看日志文件的信息:

desc v$logfile

2. 表空间

在Oracle中表空间和数据文件的概念经常是成对出现的,每一个数据文件只对应一个表空间,一个表空间可以存放多个数据文件。在创建表空间的同时必须创建数据文件,同理,如果要创建数据文件必须要指定表空间。

一个Oracle数据库是由一个或多个表空间组成的,在表空间中可以存储数据文件。这些数据文件也不是任意格式的,也要按照Oracle运行的操作系统的物理结构。数据文件中存放的就是要存放在数据库中的数据。在表空间中的逻辑存储单位是段(segment)。

3. 备份与恢复

数据库备份就是将数据库的内容全部复制出来保存到计算机的另一个位置或者其他存储设备上。数据库备份也分很多种,主要有物理备份和逻辑备份。

物理备份是指通常所说的归档模式备份(又叫热备份)和非归档模式备份(又叫冷备份),归档模式备份是当数据库的模式设置成归档模式时对数据库进行的备份;而非归档模式备份是当数据库的模式设置成非归档模式时对数据库的备份。逻辑备份主要是指对数据库的导入和导出操作,在Oracle 10g之前使用IMP/EMP的方式进行导入和导出操作,从Oracle 10g开始引入了数据泵技术,使用EXPDP/IMPDP的方式对数据进行导入和导出的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值