ORACLE练习题答案

时间:2023-02-23 09:29:04
ORACLE练习题答案


第1章  Oracle安装配置


1.Oracle安装的硬件环境是什么?
Oracle 10g安装的硬件要求为:1024MB以上的物理内存,1.5 GB至3.5 GB磁盘空间,具体大小由安装类型决定。目前的主流PC机均可满足此条件。

2.Oracle共有哪些重要版本?
Oracle目前使用最多的版本为Oracle 9i和Oracle10g。

3.Oracle 9i中的i和Oracle 10g中的g各代表什么意思。
Oracle 9i中的i代表Internet,表明该版本对Internet的支持;Oracle 10g中的g代表Grid,表明该版本提供了网格计算功能。

4.Oracle安装时需要注意的主要问题有哪些?
(1)注意硬件配置。
Oracle对硬件要求较高,因此,安装时尤其需要注意服务器的配置是否达到了要求。
(2)注意空间分配
Oracle作为数据库的本质,决定了其使用过程中是一个体积不断增大的过程,因此尤其需要注意对硬盘空间的分配。
(3)安装路径的要求
Oracle的安装路径不要包含中文字符。含有中文字符的路径在Oracle下并不能被很好的支持。


第2章  Oracle常用工具


1.简述Net Configuration Assistant(网络配置助手)与Net Manager(网络管理员)这两种工具的关系。
Net Manager具有和Net Configuration Assistant具有相似的功能。Net Configuration Assistant以向导的模式出现,可以引导初学者进行配置;而Net Manager则将所有配置步骤集合到同一界面,更适合熟练者进行操作。

2.监听程序配置中的主要参数有哪几个?
监听配置中的参数主要包括:监听程序名、协议和端口号。因为监听总是配置在Oracle数据库的服务器端,因此无需配置主机地址。

3.本地Net服务名配置中的主要参数有哪几个?
Net服务名配置中的参数主要包括:服务名、数据库名称、协议、主机地址和端口号。

4.监听程序与Net服务名的关系是怎样的?
监听程序配置在服务器端,负责监视客户端的连接请求;Net服务名配置在客户端,用于向其他工具提供连接信息的配置。客户端工具会利用Net服务名中的信息发送连接请求,监听程序会获得该请求,并作出反应。


第3章  SQL Plus和PL/SQL


1.SQL Plus与PL/SQL有何区别?
SQL Plus是Oracle提供的一种用户接口。用户可以利用SQL Plus与Oracle数据库进行交互。
PL/SQL则是Oracle的过程化编程语言。用户可以通过PL/SQL编程完成复杂的数据库操作。

2.在SQL Plus中,如果在一屏中无法显示查询结果,可以利用哪些手段进行格式化?
可以利用的手段包括:
(1)指定行的长度
可以利用set linesize命令来设置行的长度。例如,set linesize 120将会设置行的长度为120个字符。
(2)指定分页的尺寸
可以利用set pagesize命令来设置分页的尺寸。例如,set pagesize 20将会设置每页包含20行,并在每页的开头打印列名。
(3)利用输出暂停
可以利用set pause on来指定输出暂停,用户可以手动跳转到下一页,从而使分页动作更有意义。

3.简述利用SQL Plus登录数据库所使用的命令,即命令的各个参数的意义。
登录SQL Plus的命令格式为:sqlplus username/password@SID。
其中,sqlplus用于调用Oracle安装文件中的sqlplus.exe文件;username为登录数据库时使用的用户名;password则为相应的密码;SID为数据库的实例名称。需要注意的是,SID不同于Net服务名,不能用Net服务名来代替SID,除非Net服务名与SID相同。

4.试着里利用SQL Plus来创建一个新表。
可以通过如下步骤利用SQL Plus来创建一个新表:
(1)利用SQL Plus登录数据库ORCL。
在Windows的【开始】|【运行】的【打开】文本框中输入sqlplus scott/abc123@orcl来登录数据库ORCL。
(2)在SQL Plus命令行下输入如下命令来创建新表test:
create table test (id number, name varchar2(20));
(3)在SQL Plus会出现表创建成功的提示


第4章  Oralce数据库


1.请简述SID与ORACLE_SID的区别。
SID(System Identifier)是数据库实例的惟一标识。通常情况下,SID等于实例名称。
ORACLE_SID是指操作系统环境变量,并为操作系统提供默认的数据库实例名称。

2.请简述Oracle逻辑备份的主要手段。
逻辑备份是指利用exp命令进行备份。exp命令提供了以下参数供用户进行自定义备份:
(1)owner参数,可以指定一个用户名列表。导出时,将只导出用户名列表中用户所拥有的对象。
(2)tables参数,可以用于指定导出特定的数据表。

3.请简述Oracle物理备份的主要手段。
Oracle物理备份是指直接备份物理文件。物理备份分为两种:冷备份和热备份。冷备份是指在数据库关闭的状态下,备份所有的数据库文件;热备份是指对处于启动状态下的数据库进行备份。

4.请简述利用PL/SQL Developer进行备份主要步骤。
利用PL/SQL Developer进行备份的主要步骤包括:
(1)利用【Export User Ojbects】导出用户对象,所导出的内容包括用户拥有的所有对象(表、视图、存储过程、触发器、序列等)的创建脚本。
(2)利用【Export Tables】导出用户表的所有数据。


第5章  Oracle数据表对象


1.请简述创建表空间命令中的主要参数的意义。
一个典型的创建表空间的示例代码如下所示:
create tablespace user4 datafile 'f:\database\oracle\user4_data.dbf' size 20M
autoextend on next 5M maxsize 500M
其中,参数datafile指定要创建的表空间的物理文件的完整路径;
参数size指定表空间的初始大小;
参数autoextend指定表空间的尺寸是否能够自动扩展;
next参数指定每次自动扩展的尺寸;
maxsize参数指定所能扩展到的最大尺寸。

2.请简述Oracle的数据表在添加列和删除列时,语法形式上的区别。
为数据表添加列的语法形式为:
alter table talbe_name add (column1 datatype1, column2 datatype2, …);
为数据表删除列的语法形式为:
Alter table table_name drop column column_name
比较二者会发现,添加列时,无需添加关键字column,而直接使用add选项;而删除列时,必须指定关键字column。

3.请简述会话级临时表和事务级临时表的区别。
会话级临时表和事务级临时表都用来临时存储数据。事务级临时表在事务结束时,将清空表内数据;而会话级临时表在会话结束时,将清空表内数据。在一个会话中,有可能有多个事务存在,因此,会话级临时表中的数据往往比事务级临时表中的数据持久性更强。

4.请简述虚表dual的主要应用场景。
dual表是作为虚表的概念存在的,主要用于from关键字的源表。


第6章  约束


1.简述主键的存在意义。
主键被创建在一个或多个列上,通过这些列的值或者值的组合,惟一地标识一条记录。主键列的值不允许出现null,因为利用某个列值等于null的条件,是无法获得相应记录的。

2.首先创建表teacher和student,并在两个表的id之间建立外键约束。
示例代码如下:
create table teacher
(id number(3),
teacher_name nvarchar2(30));

create table student
(id number(10) constraint pk_student primary key,  --主键约束
teacher_id number(3),
student_name varchar2(20)
);

alter table student add constraint fk_teacher_student foreign key (teacher_id) references teacher(id);

3.简述惟一性约束与主键的区别。
主键设计为标识惟一一条记录,而惟一性约束则设计为保证列自身值的惟一性。

4.简述检查约束的作用。
检查约束所限制的对象为表中某列或某些列的值。每当用户执行DELETE、INSERT或UPDATE等DML动作时,都会触发检查约束的校验。校验的结果往往返回一个布尔值,如果布尔值为真,则动作可以成功执行,否则,动作将失败。

5.简述默认值约束的作用。
默认值约束为表中的列提供缺省值。当执行INSERT或UPDATE动作时,如果针对该列,没有显式指定值,那么将使用默认值进行相应操作。


第7章  视图


1.视图共分为哪几种?
视图共分为4类:关系视图、内嵌视图、对象视图和物化视图。

2.何时应当使用内嵌视图?
当所需要的查询只是作为临时结果集存在,可重用性不高时,应当考虑使用内嵌视图。

3.简述对象视图的主要特点。
对象视图创建时总是基于某个已存在的对象类型,并具有面向对象的特点。在对象视图中,对象的概念代替了行,而属性的概念代替了列。

4.简述物化视图的主要特点。
物化视图在创建时,总是同时创建一个物理表,该表存储实际的数据。物化视图会将查询结果置于物理表中。当其启用了物化视图的查询重写功能之后,对与普通表的查询按照一定条件,有可能被Oracle自动转移到对物化视图的查询,从而大大提高了查询速度和性能。

5.如何获得数据库中某个用户的所有对象名称?
视图user_objects中存储了针对普通用户的所有对象,因此可以利用该视图进行查询,如:
select owner, object_name, object_type from all_objects where lower(owner)= 'scott'
其中,owner列代表了所有者;object_name列代表了对象名称;object_type列代表了对象类型。可能的查询结果如下所示:
OWNER       OBJECT_NAME    OBJECT_TYPE
----------------  ---------------------------  -------------------
SCOTT          DEPT              TABLE
SCOTT          PK_DEPT          INDEX
SCOTT          EMP               TABLE
SCOTT          PK_EMP           INDEX
SCOTT          BONUS            TABLE
SCOTT          SALGRADE        TABLE


第8章  函数与存储过程


1.什么是函数的确定性?
函数的确定性是指,当传入的参数一定,函数的每次执行都会返回相同的值。对于确定性函数,应该使用deterministic选项进行定义。这样Oracle可以在利用相同的参数调用函数时,将直接返回以前的执行结果,而不必重新执行函数,从而提高数据库性能。
2.简述存储过程的三种参数的特点。
存储过程可以使用三种函数:IN参数、OUT参数和IN OUT参数。
IN参数是传入参数,只用于向存储过程传值,在存储过程内部不能修改其值;OUT参数为传出参数,可以在存储过程内部进行赋值,以实现类似函数返回值的功能;
IN OUT参数,既可以向其中传入参数值,也可以在存储过程内部进行修改,即具有IN和OUT参数的双重功能。
3.程序包由哪两部分构成,二者的关系如何?
程序包一般由规范和主体两部分构成。规范类似于面向对象编程语言中的接口,只是规定了该程序要所要实现的函数或存储过程的名称和参数;而主体类似于面向对象编程语言中的实现类,主体需要实现程序包中所规定的所有函数和存储过程。
4.函数和存储过程的最大区别是什么?
函数和存储过程的最大区别是,函数必须显式的返回值,而存储过程则没有返回值。


第9章  游标


1.请简述显式游标使用的一般步骤。
显式游标一般使用步骤为:声明游标,打开游标,获取游标和关闭游标。
2.请简述隐式游标与显式游标的区别。
隐式游标与显式游标的最大区别是,隐式游标不能由用户自行控制游标的打开、获取、关闭等动作。
3.请列举游标的主要属性。
游标的主要属性有四个:
found属性用于标识当前游标从结果中获取记录时,是否成功找到了记录。
not found属性是found属性的对立面。当不能成功获取记录时,将返回true,否则返回false。
rowcount属性用于返回当前时刻已经获得了多少条记录。
isopen属性用于判断游标是否处于打开状态。
4.请简述强类型动态游标与弱类型动态游标的区别。
强类型动态游标在使用时,必须声明其类型,在以后的使用过程中,虽然游标的定义可以修改,但是返回值类型是一定的。而弱类型则无需声明返回值类型,但在使用过程中,必须保证每次用于获取记录的类型都能够正确接收来自游标的数据。


第10章  触发器


1.Oracle中的触发器共有哪几类?
Oracle的触发器包括:语句触发器、行触发器、instead of触发器、系统事件和用户事件触发器。
2.语句触发器和行触发器的主要区别是什么?
语句触发器和触发器的作用对象都是表或视图。语句触发器总是被触发一次,而无论用户操作所影响的记录是一行,还是多行;行触发器则针对每一行的操作都会触发一次。
3.简述instead of触发器的主要特点。
相对于其他触发器,instead of将代替触发事件的动作,即原事件不再执行。
4.列举两个触发器的主要应用场景。
1. 信息汇总
当明细数据更新时,可以利用触发器实现汇总数据的更新。
2. 数据备份
当数据更新时,可以利用触发器将原数据记录到历史数据表中,从而实现数据跟踪。


第11章  序列


1.创建序列时,默认start with和increment by的值是多少?
创建序列时,如果没有指定start with和increment by,二者的值均为1。
2.简述start with和minvalue的区别。
start with用于指定自序列创建后,第一次调用序列的nextvalue属性所获得的值;
minvalue则为序列的最小值,当序列使用了cycle选项,循环取值时,第一次调用nextvalue属性的值即为minvalue所指定的值。
3.简述cycle的作用。
当序列达到了最大值,再次调用其nextval属性,如果该序列是cycle的,那么将进行循环取值;否则Oracle抛出错误,无法返回nextval属性的值。
4.序列的主要应用场景是什么?
序列的主要应用场景是,为表中的记录创建流水号。


第12章  用户角色与权限控制


1.简述用户与模式的关系?
一般来说,一个有效用户都会拥有若干数据库对象;而这些对象的集合即称为模式。
2.简述系统权限与对象权限的区别?
系统权限是指针对数据库中特定操作的许可。而对象权限则是针对数据库中特定对象的权限。
3.简述角色的意义。
角色是权限的集合,由于角色的可继承性与复用性,使用角色进行权限分配可以减少权限分配的工作量,提供工作效率。
4.如何实现两个角色之间的继承。
可以利用grant命令将一个角色的权限全部赋予另一角色,从而实现角色的继承。例如,grant parentRole to childRole。


第13章  Oracle数据类型


1.Oracle的数据类型主要有哪几类?
Oracle中的数据类型主要有:字符型、数值型、日期时间型和LOB型。
2.简述rowid的意义
rowid是由数据库自动创建的伪列,该列标识了数据存储的物理地址。
3.简述Oracle中空字符串与null的关系。
Oracle中将空字符串视为null。在Oracle中判断某列的值是否为空,不能将该列的值与空字符串’’进行比较,而应该使用is null。
4.简述Oracle中双引号的作用。
Oracle中的双引号主要有以下作用:
(1)用作含有特殊字符的列名。
(2)控制列名的大小写形式。


第14章  Oracle中的函数与表达式


1.简述null作为函数参数时的特点。
Oracle中大部分函数,一旦使用了null作为参数,返回值为null。因此,要特别注意对参数是否为null的处理,以便获得预期的结果。
2.简述like判式的使用方法。
like判式可用于进行模糊查询的条件,可以利用“%”——代表任意个数的任意字符、“_”——代表一个任意字符作为通配符。
例如,like '%good%'用于匹配含有“good”子字符串的字符串;like 'good%'用于匹配以“good”字符串开头的字符串。
3.简述is null判式的意义。
在Oracle中,判断某个表达式或者列的值是否为空,不能使用= ''进行判断,而应当使用is null。
4.简述窗口函数的特点。
Oracle在查询时,会捕获表中的记录,以查看是否符合查询条件。而窗口函数的意义在于,为每条记录获得临时结果集合。这些临时结果集合往往与当前记录有着这样那样的关系,从而允许为每条记录处理新的逻辑计算提供了方便。


第15章  Oracle中的控制语句


1.试用case when语句改写以下语句。
if course = '0' then
  dbms_output.put_line('数学');
elsif course = '1' then
  dbms_output.put_line('语文');
elsif course = '2' then
  dbms_output.put_line('英语');
else
  dbms_output.put_line('其他');
end if;  
改写后的代码如下所示:
case course
  when '0' then
    dbms_output.put_line('数学');
  when '1' then
    dbms_output.put_line('语文');
  when '2' then
    dbms_output.put_line('英语');
  others
    dbms_output.put_line('其他');
end case;  
2.试用无条件循环打印表employees的雇员信息(包括雇员ID、雇员姓名)。
declare cursor cu_student_id_name is
  select student_id, student_name
  from students;

  student_id students.student_id%type;
  student_name students.student_name%type;
begin
    open cu_student_id_name;
    fetch cu_student_id_name into student_id, student_name;

    loop
      dbms_output.put_line(student_id || ':' || student_name);
      fetch cu_student_id_name into student_id, student_name;
      exit when cu_student_id_name%notfound;
    end loop;

    close cu_student_id_name;
end;
3.利用while循环来完成上题的功能。
declare cursor cu_student_id_name is
  select student_id, student_name
  from students;

  student_id students.student_id%type;
  student_name students.student_name%type;
begin
    open cu_student_id_name;
    fetch cu_student_id_name into student_id, student_name;

    while cu_student_id_name %found loop
      dbms_output.put_line(student_id || ':' || student_name);
      fetch cu_student_id_name into student_id, student_name;
    end loop;

    close cu_student_id_name;
end;
4.利用for循环计算1~100之间所有奇数的和。
declare summary number;
begin
summary := 0;
for i in 1..100 loop
  if mod(i,2) = 1 then
    summary := summary i;
  end if;
end loop;
dbms_output.put_line('summary = ' || summary);
end;


第16章  SQL查询


1.在表students中,如何获取同名学生的信息?
select student_name, count(1)
from students
group by student_name
having count(1) > 1;
2.简述union与union all的区别。
Union与union all都是获得两个记录集合的并集。Union在获得并集之后,删除重复记录,而union all则不会删除重复记录。
3.利用外联接从表students与表student_course中获得学生与所选课程的信息。
select s.student_name, c.course
from students s, student_course c
where s.student_id = c.student_id( )
4.利用connect by获得中国市场下的所有子市场。
select * from market
start with market_name = '中国'
connect by prior market_id = parent_market_id


第17章  SQL更新数据


1.如何利用insert命令实现批量插入。
一个insert命令实现批量插入的示例代码如下所示:
insert into tmp_students
select (student_seq.nextval, student_name, student_status, student_age);
2.如何利用update命令修改多列的值。
一个使用update命令更新多列数据的示例代码如下所示:
update students set student_name = 10, student_age = 20 where student_id = 11
3.简述利用delete命令与truncate命令删除数据的区别。
Delete命令与truncate命令都可用于删除表中数据。不过,delete命令是DML命令,删除的数据,Oracle会提供回滚的机会;而truncate命令则是DDL命令,一旦删除数据,将无法回滚。
4.简述提交动作与回滚动作的区别。
Oracle中,在更新数据表之后,数据虽然已经影响到了数据库。提交动作相当于确认修改,此时,Oracle会将回滚段数据清除;而回滚动作,则利用回滚段数据,将数据表中的数据恢复到更新前的状态。


第18章  数据库速度优化与数据完整性


1.请简述Oracle索引的使用场景。
Oracle索引适合的使用场景为:表的数据量很大,并且更新频率较低。
2.请简述Oracle数据完整性的主要方面。
(1)实体完整性(实体完整性指表中行的完整性。要求表中的所有行都有唯一的标识符,称为主关键字)
(2)参照完整性(简单的说就是表间主键外键的关系)
(3)域完整性(域完整性指列的值域的完整性。如数据类型、格式、值域范围、是否允许空值等)
(4)用户自定义完整性
3.为表students,在列student_name上创建索引。
create index idx_student_name on students(student_name);
4.为表students,在列student_name和列student_age上创建联合索引。
create index idx_name_age on students(student_name, student_age);


第19章  数据一致性与事务管理


1.什么是事务?
事务是指包含了一条或多条SQL语句的工作单元。一个事务具有原子性,一个事务中的语句,要么全部提交,要么全部回滚。
2.利用save point和rollback to savepoint实现回滚标记点
begin
  savepoint update_students;
  update students set student_age = student_age 1;
exception
  when others then
  rollback to update_students;
end;  
【代码说明】本例首先设置了回滚标记点update_students,并利用rollback to update_students在异常发生时将数据库状态回滚到该标记点之前。
3.简述Oracle中事务的隔离级别。
(1)serializable隔离级别
serializable隔离级别是指串行化事务。串行化事务可以隔离其他事务对数据库状态的影响。
(2)read commited隔离级别
read commited隔离级别是事务的默认隔离级别,即当只能读取其他事务已经提交的修改。对于尚未提交的修改,只有实现该修改的事务本身可以进行读取。
4.简述事务的处理原则。
事务处理的原则可以概括为ACID。ACID是以下单词的首字母:
(1)原子性(Atomicity)——整个事务不可分割,要么全部执行,要么都不执行。
(2)一致性(Consistency)——事务一旦提交生效,会将数据库从一种状态转变为另一种状态。而且转变之后的状态是合理和可接受的。
(3)隔离性(Isolation)——在事务处理的过程中,事务处理的效果对于其他事务,是完全透明的。只有提交之后,其效果才能为其他事务所识别。即前面提到的read commited的隔离级别。
(4)持久性(Durablity)——一旦提交了事务处理,那么事务处理的效果将永久生效。


第20章  并发控制


1.什么是死锁?
死锁是指,两个事务相互请求已被对方锁定的资源,造成二者的工作都不能完成,而产生的相互等待。
2.什么是悲观锁定和乐观锁定?
悲观锁假定冲突在每个用户的每次修改时都存在,因此,在修改之前都首先尝试将资源进行锁定。乐观锁定假定每次更新数据时,都假定可以获得对相应数据的锁定。
3.比较悲观锁定与乐观锁定。
二者的区别主要有以下几个方面:
理念不同。
悲观锁定在执行更改之前就已经假定所请求的资源已经被其他用户锁定,所以需要首先请求锁定。锁定成功之后才进行更改。而乐观锁定在执行更改之前假定所请求的资源处于未锁定状态,直接进行更新。
性能不同
因为要首先尝试进行锁定,悲观锁定要耗费更多的资源。而乐观锁定直接进行更新,所需资源要少于悲观锁定。
风险不同
对于悲观锁定,如果在尝试锁定时失败,而又使用了等待模式,那么用户很可能在极短的时刻成功获得资源的控制权。即使未能在较短时间内获得,同样可以使用超时来限制所等待的时间。
对于乐观锁定,当一次更新失败之后,用户会在自定义的时间之后再次尝试更新。而这种更新,则面临着再次更新失败的风险。更糟糕的情况是,用户会面临多次更新失败的风险,而对应用系统的功能产生怀疑。
4.如何查看对某个表执行更新操作时,数据库中相关锁的情况?
当执行表的更新操作时,实际是为表加载了ROW EXCLUSIVE TABLE锁。
SQL> update people set status = status;
14 rows updated

SQL> select s.username,
  2  s.sid,
  3  trunc(l.id1/power(2,16)) rbs,
  4  mod(l.id1, power(2,16)) slot,
  5  l.id2 seq,