学生实验报告册
(理工类)
课程名称:大型数据库技术 专业班级:M11计算机科学与技术(专转本)
学生学号: xxxxxxxxxxx 学生姓名: xx
所属院部: 龙蟠学院 指导教师: xxxxxx
2011——20 12学年 第 2 学期
金陵科技学院教务处制
实验报告书写要求
实验报告原则上要求学生手写,要求书写工整。若因课程特点需打印的,要遵照以下字体、字号、间距等的具体要求。纸张一律采用A4的纸张。
实验报告书写说明
实验报告中一至四项内容为必填项,包括实验目的和要求;实验仪器和设备;实验内容与过程;实验结果与分析。各院部可根据学科特点和实验具体要求增加项目。
填写注意事项
(1)细致观察,及时、准确、如实记录。
(2)准确说明,层次清晰。
(3)尽量采用专用术语来说明事物。
(4)外文、符号、公式要准确,应使用统一规定的名词和符号。
(5)应独立完成实验报告的书写,严禁抄袭、复印,一经发现,以零分论处。
实验报告批改说明
实验报告的批改要及时、认真、仔细,一律用红色笔批改。实验报告的批改成绩采用百分制,具体评分标准由各院部自行制定。
实验报告装订要求
实验批改完毕后,任课老师将每门课程的每个实验项目的实验报告以自然班为单位、按学号升序排列,装订成册,并附上一份该门课程的实验大纲。
实验项目名称:熟悉Oracle环境及数据库和表的创建实验学时: 3
同组学生姓名: 实验地点: B513
实验日期: 20##-3-22 实验成绩:
批改教师: 批改时间:
实验1 熟悉Oracle环境及数据库和表的创建
一、实验目的和要求
1、熟悉Oracle10g的工作环境、了解Oracle主要管理工具的用途、掌握登录Oracle10g的方法。
2、理解权限的概念以及创建数据库必须要确定的因素:库名、所有者、大小、SGA分配和存储数据库的文件。
3、理解参数文件的作用。
4、掌握SQL*Plus、iSQL*Plus 、DBCA等主要工具的使用方法。
5、掌握行编辑命令的使用方法。
6、掌握在Oracle 10g环境下,利用DBCA和SQL创建数据库和表的方法。
二、实验设备、环境
设备:奔腾Ⅳ或奔腾Ⅳ以上计算机
环境:WINDOWS 20## SERVER或WINDOWS 20## SERVER、ORACLE 10g中文版
三、实验步骤
1、分析题意,重点分析题目要求并给出解决方法。
2、根据题目要求启动SQL*Plus、iSQL*Plus、OEM和DBCA等管理工具。
3、按题目要求完成实际操作任务,并将相关文档资料保存在以自己学号命名的文件夹中。
4、提交完成的实验结果。
四、实验内容
1、熟悉Oracle常用的管理工具
(1)OEM(主目录、性能、管理、维护)
OEM是Oracle10g的数据库控制工具,它包含有大量对DBA有用的工具,为日常的数据库操作提供了直观、方便的图形化界面GUI,包括创建新用户、角色、进行权限分配、查看数据库运行情况、创建对象方案、进行存储管理等,几乎所有的数据库管理和操作都可以通过OEM来完成。
主目录页面:该页主要提供有关数据库环境和健康的丰富的信息。包括:一般信息、主机CPU、活动会话、高可用性部分、空间使用情况和诊断部分、预警和相关预警、性能分析、以及相关链接部分。
Ø 一般信息:该部分提供数据库状态可快速概览以及数据库的基本信息。
Ø 主机CPU:有一个图形,以不同的颜色粗略显示Oracle主机的相对CPU占用率。
Ø 活动会话:显示当前活动会话的情况、当前数据库的工作以及其他SQL统计信息。
Ø 高可用性:显示相关可用信息,包括:例程恢复时间、上次备份时间、Oracle 10g数据库的最近备份时间、以及该次备份是否成功已用归档区域的百分比以及是否用了闪回事件等。
Ø 空间使用情况:显示数据库的大小、并列出数据库包含有问题的表空间的数目。段查找结果:有助于识别与存储有关的问题,并提供改善性能的建议案。
Ø 诊断概要:给出了数据库执行情况的概略;性能查找结果:表示被自动数据库诊断监视器ADDM发现的问题的数量。OEM也能够自动分析环境、以确定是否存在违反策略的操作,并将分析结果放在所诊断有违反策略的情况中。
Ø 预警和相关预警:这两部分均以表的形式给出警告信息,以引起用户的注意。
Ø 性能分析:该部分列出ADDM任务的结果。作业活动部分中包含一个作业执行的报告,显示已经调度的、正在运行的、挂起的和有问题的执行。
Ø 相关链接:指明了可以与之链接的部分。
性能页面:主要功能是监视Oracle 10g数据库服务器的运行状况,实时掌握其各种运行参数,并据此存在问题来采取相应措施来对其进行优化,以进一步提高其效率,确保系统的正常运行等。是DBA的主要任务之一。包括:主机、会话:等待和运行、例程吞吐量、和其他监视链接四个部分。
主机部分:有两个图表即:运行队列长度和分页速率。
Ø 运行队列长度:指正在等待使用CPU的进程数,表示CPU争用的程度。
Ø 分页速率:反映主机经内存内容写出道交换空间以创建更多内存空间的速率。如果内存足够,系统将不需要分页。当内存已满、内存空间争用加剧时,主机将较少使用的页空间换出。
“会话:等待和运行”:会话图表反映11种时间类型,是Oracle性能监视的核心。Y轴上显示按全部时间折算的会话数,反映数据库的平衡负载。
Ø 绿色区域表示正在访问CPU的用户。其他颜色则表示各种等待事件(如:锁、磁盘I/O重写或网络通信)的用户。
Ø 例程吞吐量:吞吐量图表反映会话活动图表中显示的各种争用的相对重要性。如果会话活动图表显示会话等待书不断增加,但吞吐量也不不断增加,则可以忍受。如果吞吐量反而下降而内部争用加剧,则应该考虑采取优化措施了。
Ø 其他监视链接数要有:Top Sessions、顶级SQL、数据库锁、阻塞会话、例程活动、顶级使用者等的链接。
管理属性页面:主要功能通过该页配置和调整数据库个各个方面,从而提高性能和调整设置。这是DBA主要工作的场所,可以完成大部分的数据库日常管理工作。
Ø 例程部分:主要有内存参数、还原管理、所有的初始化参数等内容。
Ø 存储部分:主要有控制文件、表空间、数据文件、重做日志文件组等。
Ø 安全性部分:只要有用户、角色、概要文件等。
Ø 方案部分:主要有表、索引、视图、同义词、过程、函数、触发器等。
维护属性页面:可以执行以下任务将数据导出到文件中或从文件中导入数据,将数据从文件加载到Oracle的数据库中,收集、估计、和删除统计信息,同时提高对数据库对象进行SQL查询的性能。主要包括:实用程序、备份与恢复、部署等等三个部分。
Ø 实用程序部分:主要有导入导出、加载数据、聚集统计信息、重组对象和本地管理表空间等。
Ø 备份与恢复部分:主要提供对系统数据的备份和恢复两项功能,有效地避免数据的丢失。只要包括:调度备份、执行恢复、管理当前恢复、配置备份设置、配置恢复设置、配置恢复目录设置等内容。
Ø 部署部分:主要目的是为了避免系统(包括数据)丢失,此外,还提供了其他一些功能,如配置收集状态、管理策略库等。包括:补丁程序、克隆数据库、克隆Oracle主目录、查看补丁程序高速缓存、配置收集状态、管理策略库,管理违反策略的情况等。
(2)SQL*Plus 主要的编辑命令:
文件操作命令:
(3)iSQL *Plus
iSQL*Plus允许使用Web浏览器连接到Oracle 10g并执行如同在SQL*Plus命令行版中执行的相同操作。可以使用iSQL*Plus来编辑SQL*Plus、SQL、PL/SQL命令,从而输入、编辑、运行并保存SQL命令和PL/SQL块以及计算结果。
(4)DBCA
2、利用DBCA创建数据库
(1)数据库名称为Orcl,它的全局数据库名Orcl.COM.CN
(2)控制文件有3个,其存取路径为:D:\oracle\oracdata\Orcl\ 其名称为CONTROL01.CTL、CONTROL02.CTL、CONTROL03.CTL。
(3)重做日至文件有3个其大小为10MB,存取路径为:D:\oracle\oradata\ Orcl \ 名称为:redo01.log、redo02.log、redo03.log。
(4)创建临时表空间temp01.dbf。
(5)字符集为ZHS16GBK,国家字符集为AL16UTF16。
(6)数据块大小为:4KB。
3、利用DBCA删除数据库Orcl
4、使用PL/SQL手工创建数据库(选做)
(1)确定新数据库对应的实例名(SID)
(2)确定DBA认证方法
(3)创建初始化参数文件
(4)使用SQL*Plus连接到实例
(5)创建服务器参数文件(推荐)
(6)启动实例
(7)使用CREATE DATABASE语句创建数据库
(8)创建附加的表空间
(9)运行脚本以创建数据库字典视图
参见:参数文件脚本和创建数据库文件脚本
5、在OEM中分别创建表Employees、Departments和Salary(表结构请参见text文本)
6、在OEM中删除创建的Employees、Departments和Salary表
7、使用SQL语句创建表Employees、Departments和Salary及相应的约束。
五、问题解答及实验结果
1.创建表DEPARTMENT、EMPLOYEES、SALARY, 并输入表的结构
表DEPARTMENT的数据结构:
CREATE TABLE DEPARTMENT
(
DEPARTMENTID CHAR(3) NOT NULL,
DEPARTMENTNAME CHAR(20) NOT NULL,
NOTE CHAR(16),
PRIMARY KEY(DEPARTMENTID)
);
表EMPLOYEES的数据结构:
CREATE TABLE EMPLOYEES
(
EMPLOYEEID CHAR(6) NOT NULL,
NAME CHAR(10) NOT NULL,
BIRTHDAY DATE NOT NULL,
SEX NUMBER(1) NOT NULL,
ADDRESS CHAR(20),
ZIP CHAR(6),
PHONENUMBER CHAR(12),
EMAILADDRESS CHAR(30),
DEPARTMENTID CHAR(3) NOT NULL,
PRIMARY KEY(EMPLOYEEID),
FOREIGN KEY(DEPARTMENTID)REFERENCES DEPARTMENTS(DEPARTMENTID)
);
表SALARY的数据结构:
CREATE “m1106”.”TABLE SALARY”
(
“EMPLOYEEID” CHAR(6) NOT NULL,
“INCOME” NUMBER(8,2) NOT NULL,
“OUTCOME” NUMBE NOT NULL,
PRIMARY KEY(EMPLOYEEID)
)
六、实验体会和收获
通过本次的实验,我知道了如何通过Oracle的工作环境来创建表的结构,表的约束条件包括主键和外键。对于表的结构中每一条属性要设置好,防止在插入数据的时候,发生错误!及其表名要使用统一。
Oracle数据库作为一个大型的数据库,在我们的计算机领域的应用非常广泛。同时它的重要性我们都有目共睹,因此我们该学好数据库的,并能熟练掌握它的各项功能和应用。
在此次的实验中,也遇到了一些问题,譬如外键的创建,通过同学的帮助,解决了此问题!也发现了自己的不足,对于SQL语言的写法不是很熟悉,要加强自己这方面的锻炼!
实验项目名称:表数据的插入、修改和删除等 实验学时: 3
同组学生姓名: 实验地点: B513
实验日期: 2012/04/12 实验成绩:
批改教师: 批改时间:
实验2 表数据的插入、修改与删除等
一、实验目的和要求
1、了解SQL语言对表数据操作的灵活控制功能,以及数据更新操作时要注意数据的完整性。
2、掌握在SQL *Plus或iSQL*Plus窗口中用PL/SQL语言对表数据进行增、删、改操作的方法。
3、能够在OEM中查看相应的数据。
4、通过替换变量的练习,理解替换变量在程序中的用途。
5、通过环境变量的设置,了解按相应格式的显示功能以及SQL*Plus的报表打印功能。
二、实验设备、环境
设备:奔腾Ⅳ或奔腾Ⅳ以上计算机
环境:WINDOWS 20## SERVER或WINDOWS 20## SERVER、ORACLE 10g中文版
三、实验步骤
1、分析题意,重点分析题目要求并给出解决方法。
2、根据题目要求启动SQL*Plus、iSQL*Plus、OEM等管理工具。
3、按题目要求完成实际操作任务,并将相关文档资料保存在以自己学号命名的文件夹中。
4、提交完成的实验结果。
四、实验内容
1、熟悉SQL*Plus或iSQL*Plus的使用方法,用SQL语言向已经建立的Departments表、Employees和Salary表中添加数据。(注:请将SQL语句存入脚本文件中以便以后利用。)
2、掌握用SQL语言对表数据进行修改和删除的方法。
(1)用SQL语言删除表Employees与Salary的编号为010008和210678的记录。注意进行删除操作时,作为两表主键的EmployeeID的值,应保持数据的完整性。
(2)删除表Departments中编号为2的记录,同时也要删除表Employees中部门编号为2的记录。(思考:应该首先删除哪一个表的记录?)
(3)将表Employees中职员编号为020018的记录的部门号改为4。
(4)使用TRANCATE TABLE 语句删除表中所有行。
3、掌握替换变量的使用方法。(参见P109-110)
(1)&替换变量的使用
在Employees表中根据指定的雇员号,查询该雇员的情况。
(2)&&替换变量的使用
使用&&替换变量,在Employees表中查询部门人数大于2的部门编号。
(3)DEFIN和ACCEPT命令的使用。
a.定义一个变量dept,并为其赋予值“人力资源部”,然后显示该变量的信息。引用该变量查询人力资源部的信息。
b.使用ACCEPT定义一个变量num,且指定提示文本为“请输入职工编号:”,根据这个变量的值,查询该职工的姓名、性别和工资情况。
4、报表输出格式(参见P100-102)
(1)定义页眉:职工情况 要求:居中。
(2)定义页脚:-------report1.sql
(3)每行50个字符,每页35行。
五、问题解答及实验结果
1插入 insert into Departments values(’1’,’财务部’,null);
………
insert into employees values('108991','钟敏','10-8月 -69','0','中山路108-3-105','210003','3346722','zhongmin@sohu.c','3');
………
insert into salary values(‘000001’, ‘2100.8’,’ 123.09’);
………
2.删除
(1) Delete from Employees,Salary
Where EMPLOY=010008 and EMPLOY=210678;
(2) Delete from Employees
Where DEPARTMENTID=2;
Delete from Departments
Where DEPARTMENTID=2;
(3) update Employees
set DEPARTMENTID=4
where EMPLOY= 020018;
(4) TRANCATE Employees
3替换变量
(1)select EMPLOY,NAME,BIRTHDAY,SEX,ADDRESS,PHONENUMBER,EMAILADDRESS, DEPARTMENTID
From employees
Where DEPARTMENTID=&amount;
(2) select EMPLOY,NAME,BIRTHDAY,SEX,ADDRESS,PHONENUMBER,EMAILADDRESS, &&DEPARTMENTID
From employees
Where DEPARTMENTID>&amount;
(3)a define DEPARTMENTNAME=” 人力资源部”(CHAR)
Select *
From departments
Where DEPARTMENTNAME=upper( ‘&人力资源部’)
b accept num prompt’请输入员工编号:’
Select NAME, SEX, INCOME
From employees,salary
Where EMPLOY =upper(‘& num’);
六、实验体会和收获
通过这次实验,我了解了SQL语言对表数据操作的灵活控制功能,以及数据更新操作时要注意数据的完整性。掌握在SQL *Plus或iSQL*Plus窗口中用PL/SQL语言对表数据进行增、删、改操作的方法。能够在OEM中查看相应的数据;通过替换变量的练习,理解替换变量在程序中的用途;通过环境变量的设置,了解按相应格式的显示功能以及SQL*Plus的报表打印功能。虽然对于SQL语言我还不是很熟练,但是我会好好练习。
实验项目名称: 数据库的查询 实验学时: 3
同组学生姓名: 实验地点: B513
实验日期: 2012/04/26 实验成绩:
批改教师: 批改时间:
实验3 数据库的查询
一、实验目的和要求
1、通过实验进一步理解SQL语言中的SELECT语句的语法结构,理解各个子句的含义以解决复杂的查询问题。
2、掌握SELECT语句的基本语法。
3、掌握子查询和连接查询语句的编写方法。
4、掌握聚集函数、GROUP BY、HAVING子句以及ORDER BY子句等的编写方法。
5、了解层次查询的功能以及适用范围,掌握层次查询的编写方法。
6、了解翻译函数的用途,掌握在查询中使用翻译函数加密数据的方法。
7、了解分析查询的功能,掌握分析查询的编写方法。
二、实验设备、环境
设备:奔腾Ⅳ或奔腾Ⅳ以上计算机
环境:WINDOWS 20## SERVER或WINDOWS 20## SERVER、ORACLE 10g中文版
三、实验步骤
1、分析题意,重点分析题目要求并给出解决方法。
2、根据题目要求启动SQL*Plus、iSQL*Plus、OEM等管理工具。
3、按题目要求完成实际操作任务,并将相关文档资料保存在以自己学号命名的文件夹中。
4、提交完成的实验结果。
四、实验内容
1、SELECT语句的基本使用。
(1)查询Employees表中女雇员的地址和电话,使用AS子句将结果中各列的标题分别指定为地址、电话。
(2)计算每个雇员的实际收入。
(3)找出所有姓王的雇员的部门号。
(4)找出所有收入在2000和3000元之间的雇员号码。
2、子查询的使用。
(1)查找在财务部工作的雇员的情况。
(2)查找财务部年龄不低于研发部雇员年龄的雇员姓名。
(3)查找比所有财务部的雇员收入都高的雇员的姓名。
3、连接查询。
(1)查询每个雇员的基本信息及其薪水的情况。
(2)查找财务部收入在2200元以上的雇员姓名及其薪水详情。
4、聚集函数的应用。
(1)求财务部雇员的平均收入。
(2)求财务部雇员的总人数。
5、GROUP BY、ORDER BY字句的使用。
(1)求各部门的雇员数。
(2)将各雇员的情况按收入由高到低排列。
6、层次查询(参见P170-172)
(1)在SQL *Plus或iSQL *Plus 中运行bicycle.sql脚本文件,创建bicycle表,并插入相应的数据。
(2)使用start with子句来指定树状结构、使用connect by子句指定父节点和字节点之间的关系。
(3)使用level伪列来表示树状结构的层次,并使用Order by子句对level列的数据进行排序。
(4)使用column命令设置partName列长为35位长的字符、设置mp_cost列按照9999.99的格式显示数字、使用lpad()函数增加空格,直观的显示bicycle表中的数据。
(5)检索零部件包含“飞轮”字符的零部件代号,并从该节点开始执行层次查询。
7、翻译查询
(1)使用translate()函数对bicycle表中的零件成本数据进行加密,密钥源表达式:1234567890,密钥终表达式为:5129837047。
8、分析查询
(1)在SQL *Plus或iSQL *Plus中运行sales_fact.slq脚本文件,创建sales_fact_2006表,并插入相应的数据。
(2)使用over()关键字和sum()分析函数执行累加分析。
(3)指定赵亦、钱尔、李斯三位销售员参加分析查询。
五、问题解答及实验结果
1.1
select address as 地址,phonenumber as 电话
from employees
where sex=0;
1.2
set linesize 120
select employeeid,income-outcome 实际收入
from salary;
1.3
select departmentid,name
from employees
where name like '王%';
1.4
select income,employeeid
from salary
where income between 20## and 3000;
2.1
select *
from employees
where employees.departmentid=(select departmentid from department
where departmentname='财务部');
2.2
select name
from employees
where departmentid = (select departmentid
from department
where departmentname='财务部')
and birthday < (select min(birthday)
from employees
where departmentid=(select departmentid
from department
where departmentname='研发部'));
2.3
select name
from employees
where employeeid in( select employeeid from salary where income>(select max(income)
from salary where employeeid in (select employeeid from employees
where departmentid = (select departmentid from department
where departmentname ='财务部'))));
3.1
select employees.employeeid,name,birthday,sex,address,zip,phonenumber,emailaddress,departmentid,salary.employeeid,income,outcome
from salary,employees
where salary.employeeid=employees.employeeid;
3.2
select name,income,outcome
from employees,salary
where employees.employeeid=salary.employeeid
and income>2200 and departmentid=(select departmentid
from department
where departmentname='财务部');
4.1
select avg(income)
from salary
where employeeid in (select employeeid
from employees
where departmentid='1');
4.2
select count(*) from employees where departmentid=(select departmentid from department where departmentname='财务部');
5.1
select departmentid,count(*) as 人数 from employees group by departmentid;
5.2
select employees.*,salary.income from employees,salary where employees.employeeid =salary.employeeid order by income desc;
6.1
create table bicycle(
part_id number(5) constraint pk_bicycle_part_id primary key,
parent_id number(5) constraint fk_bicycle_pid references bicycle(part_id),
part_name varchar2(30) not null,
mp_cost number(9, 2),
describe varchar2(30)
);
insert into bicycle values(1, null, '自行车', 379.28, '装配');
insert into bicycle values(2, 1, '导向系统', 101.11, '制造');
insert into bicycle values(3, 1, '驱动系统', 159.56, '制造');
insert into bicycle values(4, 1, '其他部分', 118.61, '制造和采购');
insert into bicycle values(5, 2, '车把', 37.28, '制造');
insert into bicycle values(6, 2, '前叉', 24.35, '制造');
insert into bicycle values(7, 2, '前轴', 19.67, '制造');
insert into bicycle values(8, 2, '前轮', 19.81, '制造');
insert into bicycle values(9, 7, '前轴棍', 8.16, '制造');
insert into bicycle values(10, 7, '前轴身', 4.82, '制造');
insert into bicycle values(11, 7, '前轴碗', 6.69, '制造');
insert into bicycle values(12, 10, '前轴管', 1.61, '制造');
insert into bicycle values(13, 10, '前花盘', 3.21, '制造');
insert into bicycle values(14, 3, '脚蹬', 18.99, '制造');
insert into bicycle values(15, 3, '中轴', 25.27, '制造');
insert into bicycle values(16, 3, '链条', 21.65, '制造');
insert into bicycle values(17, 3, '飞轮', 29.12, '制造');
insert into bicycle values(18, 3, '后轴', 31.72, '制造');
insert into bicycle values(19, 3, '后轮', 32.81, '制造');
insert into bicycle values(20, 17, '外套', 9.35, '制造');
insert into bicycle values(21, 17, '平档', 5.82, '制造');
insert into bicycle values(22, 17, '芯子', 5.11, '制造');
insert into bicycle values(23, 17, '千斤', 6.56, '制造');
insert into bicycle values(24, 17, '钢珠', 2.28, '采购');
insert into bicycle values(25, 4, '车架', 81.78, '制造');
insert into bicycle values(26, 4, '车闸', 15.26, '制造');
insert into bicycle values(27, 4, '链罩', 7.10, '采购');
insert into bicycle values(28, 4, '车铃', 4.33, '采购');
insert into bicycle values(29, 4, '车锁', 5.02, '采购');
insert into bicycle values(30, 4, '支架', 5.12, '制造');
6.2
select level,part_id,parent_id,part_name,mp_cost
from bicycle
start with part_id=1
connect by prior part_id = parent_id;
6.3
select level,part_id,parent_id,part_name,mp_cost
from bicycle
start with part_id=1
connect by prior part_id = parent_id
order by level;
6.4
column partName formart A35
column mp_cost formart 9999.99
select level,lpad('',3*level-1)||partname as partName,mp_cost
from bicycle
start with part_id=1
connect by prior part_id=parent_id;
6.5
select level,
lpad(' ',3*level-1)||part_name as partname,
mp_cost
from bicycle
start with part_id =(
select part_id
from bicycle
where part_name like '%飞轮%')
connect by prior part_id = parent_id;
7.1
select part-name,
mp_cost as actualcost
translate(mp_cost,.12345678,5129837046) as translatedcost
from bicycle;
8.1-
create table sales_fact_2006(
sale_year number(4) not null,
sale_quarter number(1) not null,
sale_month number(2) not null,
sale_book_id varchar(20) not null,
sdale_region varchar(10) not null,
sale _person varchar(20) not null,
sale _amount number(10,2) null,
constraint pk_sale_f2006 primary key(
sale_year, sale_quarter, sale_month, sale_book_id, sdale_region, sale _person)
);
insert into sales_fact_2006 values(2006,1,1,'ISBN 7-X','北京','赵亦',13526.12);
insert into sales_fact_2006 values(2006,1,2,'ISBN 7-X','北京','钱尔',8213.91);
insert into sales_fact_2006 values(2006,1,3,'ISBN 7-X','北京','孙三',33871.52);
insert into sales_fact_2006 values(2006,2,4,'ISBN 7-X','北京','李斯',22343.8);
insert into sales_fact_2006 values(2006,2,5,'ISBN 7-X','上海','周武',3455.93);
insert into sales_fact_2006 values(2006,2,6,'ISBN 7-X','上海','孙三',23427.72);
insert into sales_fact_2006 values(2006,3,7,'ISBN 7-X','香港','杨琪',897.15);
insert into sales_fact_2006 values(2006,3,8,'ISBN 7-X','香港','钱尔',12345);
insert into sales_fact_2006 values(2006,3,9,'ISBN 7-X','澳门','冯久',37817.12);
insert into sales_fact_2006 values(2006,4,10,'ISBN 7-X','澳门','冯久',6524.1);
insert into sales_fact_2006 values(2006,4,11,'ISBN 7-X','台北','李斯',93415.83);
insert into sales_fact_2006 values(2006,4,12,'ISBN 7-X','台北','孙三',23232.82);
8.2
Select sale_person,
Sum(sale_amount) as person_amount,
Sum(sum(sale_amount))
Over ( order by sale_person rows between unbounded breceding and current row)
From sales_fact_2006
Group by sale_person
Order by sale_person;
8.3
Select sale_person,
Sum(sale_amount) as person_amount,
Sum(sum(sale_amount))
Over ( order by sale_person rows between unbounded breceding and current row)
From sales_fact_2006
Where sale_person in(‘赵亦‘, ‘钱尔‘, ‘李斯‘ )
Group by sale_person
Order by sale_person;
六、实验体会和收获
通过此次实验进一步理解SQL语言中的SELECT语句的语法结构,理解各个子句的含义以解决复杂的查询问题。基本掌握SELECT语句的基本语法和子查询和连接查询语句的编写方法。初步掌握聚集函数、GROUP BY、HAVING子句以及ORDER BY子句等的编写方法,还了解层次查询的功能以及适用范围,掌握层次查询的编写方法,及其翻译函数的用途,掌握在查询中使用翻译函数加密数据的方法,也了解分析查询的功能和掌握分析查询的编写方法。但是对于SQL语言我还不是很熟练,我会好好练习。
实验项目名称: 视图、索引和完整性等 实验学时: 3
同组学生姓名: 实验地点: B513
实验日期: 20##-5-3 实验成绩:
批改教师: 批改时间:
实验4 视图、索引和完整性等
一、实验目的和要求
1、了解视图的基本概念、种类及各自的特点与作用。
2、理解索引的基本概念及其优缺点。
3、理解修改数据时索引的开销。
4、理解数据完整性的概念及分类。
5、理解同义词和序列的基本概念。
6、掌握在OEM中创建视图、索引、实体完整性、域完整性和参照完整性以及同义词、序列的方法。
7、掌握用PL/SQL语言创建视图、索引、各种约束、同义词和序列的方法。
二、实验设备、环境
设备:奔腾Ⅳ或奔腾Ⅳ以上计算机
环境:WINDOWS 20## SERVER或WINDOWS 20## SERVER、ORACLE 10g中文版
三、实验步骤
1、分析题意,重点分析题目要求并给出解决方法。
2、根据题目要求启动SQL*Plus、iSQL*Plus、OEM等管理工具。
3、按题目要求完成实际操作任务,并将相关文档资料保存在以自己学号命名的文件夹中。
4、提交完成的实验结果。
四、实验内容
1、视图的创建与使用。
(1)创建一个名为cx_employees的视图,只允许查看雇员的编号、姓名、生日、性别和部门的编号。
(2)创建一个名为cx_salary的视图,要求只显示财务部雇员的姓名和薪水情况。
使用视图,查询财务部雇员中姓名为王林的信息。
(3)通过视图向Employees表插入一条信息:雇员编号:510888;姓名:张无忌;出生年月1982年8月23日;性别:男;部门编号:3。
(4)将张无忌从经理办公室转到市场部。
(5)将张无忌从Employees表中删除。
2、创建索引。
(1)对ORCL数据库中的Employees表中的DepartmentID属性上建立一个名为DeptID_index索引,并指定索引的存储特征值,数据库中的行以升序保存,将索引建立在用户默认的表空间里。
(2)在Employees表的sex列上建一个位图索引。
(3)删除这两个索引。
3、实现域完整性。
(1)为ORCL数据库的Employees表的PhoneNumber建立CHECK约束要求输入值为0-9数字。
(2)为ORCL数据库的SALARY表中增加一个约束,要求INCOME的值不大于4000。
(3)为ORCL数据库的Employees表的sex属性建一个约束要求输入的值只能是男或是女。
4、实现实体完整性。
(1)为Employees表的name和sex属性上建立一个唯一值约束。
5、实现参照完整性。
(1)Salary表的EmployeesID属性上建立外键,参照Employees中的相关属性。
6、同义词
(1)为Scott模式下的DEPT表建立一个公有的同义词,名称不变。
(2)删除创建的同义词。
7、序列
(1)创建一个名为E_TEST的序列,初始值为1,最大值为5000,每次按2增长,不循环使用。
(2)用命令来查询并显示序列的值。
(3)创建一个Test表,表中包含ID,SNAME,SDEPT三个字段,要求ID使用刚刚创建的序列。
五、问题解答及实验结果
1.1
create view cx_employees(employeeid,name,birthday,departmentid)
as
select employeeid,name,birthday,departmentid
from employees;
1.2
create view cx_salary(name,income,outcome)
as
select name,income,outcome
from employees,salary
where employees.employeeid=salary.employeeid and departmentid=(select departmentid from department where departmentname='财务部');
1.3
insert into employees values('510888', '张无忌','23-8月-82','1','','','','','3')
select * from cx_employees
1.4
update cx_employees
set departmentid=5
where name='张无忌';
1.5
delete
from employees
where name = '张无忌';
2.1
create index DeptID_index
on Employees(DepartmentID);
2.2
create bitmap index emp_mgr_bmp
on Employees(sex);
2.3
drop index DeptID_index;
drop index emp_mgr_bmp;
3.1
alter table Employees
add constraint PhoneNumber
CHECK (PhoneNumber between 0 and 9);
3.2
alter table salary
add constraint income
check (income <= 4000);
3.3
alter table Employees
add constraint sex
check (sex in ('1','0'));
4.1
alter table Employees
add constraint name
unique(name);
alter table Employees
add constraint sex
unique(sex);
5.1
alter table salary
add constraint EmployeesID
FOREIGN KEY(EMPLOYEEID)REFERENCES Employees(EMPLOYEEID);
6.1
create public synonym DEPT for Scott.DEPT@orcl
6.2
drop public synonym DEPT;
7.1
CREATE SEQUENCE E_TEST
START WITH 1
INCREMENT BY 2
MAXVALUE 5000
NOCYCLE;
7.2
select E_TEST.NEXTVAL from DUAL;
7.3
CREATE TABLE Test
(
ID int,
SNAME varchar(10),
SDEPT varchar(20)
);
insert into Test values(E_TEST.NEXTVAL,'张斌','信息学院')
六、实验体会和收获
在此次实验中,了解了视图的基本概念,学会了如何创建视图和索引,及其如何向视图中插入数据,和更新数据。在实现域的完整性的时候,用alter的sql语言来编写,在写题目的同时也理解数据完整性的概念及分类。在理解同义词和序列的基本概念的基础上,加上参照PPT的过程中完成了SQL语言的编写。但是在序列的查询时,遇到了一些问题,通过老师的帮助,得到了解决。
实验项目名称: PL/SQL编程 实验学时: 3
同组学生姓名: 实验地点: B513
实验日期: 20##-5-17 实验成绩:
批改教师: 批改时间:
实验5 PL/SQL编程
一、实验目的和要求
1、了解变量的分类和使用方法。
2、掌握各种运算符的使用方法。
3、理解PL/SQL集合对象的功能,掌握记录类型、PL/SQL表等创建方法。
4、理解PL/SQL 基本程序结构,掌握控制语句的编写方法。
5、理解游标的属性和用途,能够使用游标的属性定义相应的游标。
6、理解PL/SQL中错误处理技术,能够编写异常处理的程序。
二、实验设备、环境
设备:奔腾Ⅳ或奔腾Ⅳ以上计算机
环境:WINDOWS 20## SERVER或WINDOWS 20## SERVER、ORACLE 10g中文版
三、实验步骤
1、分析题意,重点分析题目要求并给出解决方法。
2、根据题目要求启动SQL*Plus、iSQL*Plus、OEM等管理工具。
3、按题目要求完成实际操作任务,并将相关文档资料保存在以自己学号命名的文件夹中。
4、提交完成的实验结果。
四、实验内容
1、PL/SQL集合(参见教材P219-222)
(1)定义一个名为my_record_type的记录类型,要求包含:name、address、tel三个字段,三个字段的数据类型和employees表中相应的字段的数据类型相同。给三个字段赋值(值分别为:‘李四’、‘江宁弘景大道99号’、‘86-25-86188966 ’)并显示其值。
(2)定义一个名为my_table_type的PL/SQL表类型,使用索引算子给表的变量赋三个值,用count函数计算赋值的个数,并显示结果。
2、游标
(1)定义一个名为my_cursor_par的游标,通过参数来指定职员编号,并显示该编号职员的姓名。
(2)定义一个名为my_cursor的游标,该游标用于查询departments表中的数据,可以使用%found属性来控制游标的循环,显示查询出的结果。
3、条件结构的使用
(1)查询总学分大于40的学生人数。
(2)判断计算机系总学分大于40的人数是否超过80人。
(3)如果“数据库原理”课程的平均成绩高于75分,则显示“平均成绩大于75”,否则显示“平均成绩小于75”。
(4)求ax²+bx+c=0的根。
4、循环结构的使用。
(1)用LOOP_EXIT_END循环结构求10的阶乘。
5、选择和跳转语句。
(1)CASE语句的应用。用CASE语句编写一段程序,课程号为:101,则结果为:计算机基础;课程号为:102,则结果为:程序设计语言,课程号为:206,则结果为:离散数学,课程号为其他值,则结果为:Nothing
(2)设有一表temp(xh char(6),xb char(2),xm…),初始化表temp。
6、错误处理
(1)编写一个除零的异常处理程序。
五、问题解答及实验结果
1.1
set serveroutput on
declare
type my_record_type is record(
name char(10),
address char(20),
tel char(12)
);
l_my_loc my_record_type;
begin
l_my_loc.name:='李四';
l_my_loc.address:='江宁弘景大道99号';
l_my_loc.tel:='86-86188966';
dbms_output.put_line('我的地址是:');
dbms_output.put_line(l_my_loc.name);
dbms_output.put_line(l_my_loc.address);
dbms_output.put_line(l_my_loc.tel);
end;
1.2
set serveroutput on
declare
type my_table_type is table of varchar2(20) index by binary_integer;
l_my_tab my_table_type;
begin
l_my_tab(1):='金陵科技学院';
l_my_tab(2):='校园北区';
dbms_output.put_line('此处有'||l_my_tab.count||'个varchar2变量');
dbms_output.put_line('变量(1)='||l_my_tab(1));
dbms_output.put_line('变量(2)='||l_my_tab(2));
end;
2.1
set serveroutput on
declare
cursor my_cursor_par(id char) is select name from employees where EMPLOYEEID=ID;
t_name employees.name%type;
begin
open my_cursor_par('102201');
loop
fetch my_cursor_par into t_name;
exit when my_cursor_par%notfound;
dbms_output.put_line(t_name);
end loop;
close my_cursor_par;
end;
2.2
set serveroutput on
declare
cursor my_cursor is select * from department;
myrecord department%rowtype;
begin
open my_cursor;
fetch my_cursor into myrecord;
while my_cursor%found
loop
dbms_output.put_line(myrecord.departmentid||','||myrecord.departmentname||','||myrecord.note);
fetch my_cursor into myrecord;
end loop;
close my_cursor;
end;
3.1
set serveroutput on
declare
student_num number:=0;
begin
for cursor_i in(select * from xs)
loop
if cursor_i.zxf>40 then
student_num:=student_num+1;
end if;
end loop;
dbms_output.put_line('总学分大于40的学生人数为:'||to_char(student_num));
end;
3.2
set serveroutput on
declare
student_num number:=0;
begin
for cursor_i in(select * from xs)
loop
if cursor_i.zxf>40 then
student_num:=student_num+1;
end if;
end loop;
dbms_output.put_line('总学分大于40的学生人数为:'||to_char(student_num));
if student_num>80 then
dbms_output.put_line('总学分大于40的学生的人数大于80个');
end if;
end;
3.3
set serveroutput on
declare
avg_cj number;
begin
select avg(cj) into avg_cj
from xs_kc,kc
where xs_kc.kch=kc.kch and kc.kch='数据库原理';
if avg_cj>75 then
dbms_output.put_line('平均成绩高于75');
elsif avg_cj=75 then
dbms_output.put_line('平均成绩等于75');
else
dbms_output.put_line('平均成绩小于75');
end if;
end;
3.4
set serveroutput on
declare
a number;
b number;
c number;
x1 number;
x2 number;
d number;
begin
a:=&a1;
b:=&b1;
c:=&c1;
d:=b*b-4*a*c;
if a=0 then
x1:=-c/b;
dbms_output.put_line('只有一个根:x1='||to_char(x1));
elsif d<0 then
dbms_output.put_line('有两个根:x1='||to_char(x1)||'x2='||to_char(x2));
end if;
end;
4.1
declare l_loops number:=1;
s number:=1;
begin
dbms_output.put_line('循环开始');
loop
exit when l_loops>10;
dbms_output.put_line('第'||'loops'||'次循环');
s:=s*l_loops;
l_loops:=l_loops+1;
end loop;
dbms_output.put_line(s);
dbms_output.put_line('循环结束');
end;
5.1
set echo off
set define '&'
set verify off
set serveroutput on size 10000
accept num prompt'请输入课程号';
declare kch number :=#
begin
case kch
when 101 then dbms_output.put_line('计算机基础');
when 102 then dbms_output.put_line('程序设计语言');
when 206 then dbms_output.put_line('离散数学');
else dbms_output.put_line('Nothing');
end case;
end;
5.2
create table temp(
xh char(6),
xb char(2),
xm char(10));
6.1
set serveroutput on
declare
a number;
b number;
c number;
div_zero_exception execption;
begin
a:=&a1;
b:=&b1;
case b
when 0 then raise div_zero_exception;
else
c:=a/b;
dbms_output.put_line('a/b='||to_char(c));
end case
exception
when div_zero_exception then
dbms_output.put_line('除零的异常处理');
end;
六、实验体会和收获
通过此次的实验,我了解了部分变量的分类及其使用的方法,基本掌握各种运算符的使用方法。基本理解了PL/SQL集合对象的功能,及其的记录类型、PL/SQL表等创建方法。同时还理解了PL/SQL 基本程序结构,同时掌握控制语句的编写方法,也理解游标的属性和用途,能够使用游标的属性定义相应的游标。理解了PL/SQL中错误处理技术,能够编写异常处理的程序。在此次试验中让我知道小细节也要注意,慢慢积累。遇到了一些问题,通过老师的帮助都得到了解决。
实验项目名称:存储过程、函数和程序包的使用 实验学时: 3
同组学生姓名: 实验地点: B513
实验日期: 2012.05.24 实验成绩:
批改教师: 批改时间:
实验6 存储过程、函数和程序包的使用
一、实验目的和要求
1、理解过程、函数和程序包的基本概念。
2、理解过程中使用的输入、输出参数。
3、了解函数和过程的区别。
4、掌握储存过程和函数的编写和使用方法。
5、理解程序包的结构。
6、掌握程序包的编写和使用方法。
二、实验设备、环境
设备:奔腾Ⅳ或奔腾Ⅳ以上计算机
环境:WINDOWS 20## SERVER或WINDOWS 20## SERVER、ORACLE 10g中文版
三、实验步骤
1、分析题意,重点分析题目要求并给出解决方法。
2、根据题目要求启动SQL*Plus、iSQL*Plus、OEM等管理工具。
3、按题目要求完成实际操作任务,并将相关文档资料保存在以自己学号命名的文件夹中。
4、提交完成的实验结果。
四、实验内容
1、储存过程的创建
(1)编写一个名为EmployeeAdd的用于添加职员记录的储存过程。
(2)编写一个名为EmployeeUpdate的用于修改职员记录的存储过程。
(3)调用EmployeeAdd存储过程。
(4)调用Employeeupdate存储过程。
2、用户自定义函数
(1)定义一个名为check_id的函数,要求实现如下功能:对于一个给定的DepartmentID值,查询该值在Departments表中是否存在,若存在返回0,否则返回-1。
(2)写一段PL/SQL脚本程序调用上述函数。当向Employees表插入一记录时,首先调用函数CHECK_ID检索该记录的DepartmentID值在表Departments的DepartmentID字段中是否存在对应的值,若存在,则将该记录插入Employees表。
3、程序包的创建
(1)创建名为TEST的包头要求包含第1、2题创建的存储过程和函数。
(2)创建TEST包体
(3)调用该程序包。
五、问题解答及实验结果
1-1
create or replace procedure EmployeeAdd (p_employeeid char,p_name char,p_birthday date,p_sex
number,p_address char,p_zip char,p_phonenumber char,p_emailaddress char,p_departmentid char) as
begin insert into employees values
(p_employeeid,p_name,p_birthday,p_sex,p_address,p_zip,p_phonenumber,p_emailaddress,p_departmentid);
end EmployeeAdd;
1-2
create procedure EmployeeUpdate(empid char)
as
begin
update employees set phonenumber='1232228' where employeeid=empid;
end;
1-3
exec EmployeeAdd('21000','张三','12-10月-68','1','北京东路100-2','210002','3321321','','1');
1-4
exec EmployeeUpdate('122356');
2-1
create or replace
function check_id(id char) return number
as
n number;
begin
select departmentid into n from department where departmentid=id;
if n is null then n:=-1;
else n:=0;
end if;
return n;
end;
2-2
declare l_str number;
begin l_str:=CHECK_ID('3');
if l_str = 0 then
insert into employees values('122357','伍','28-3月-66',1,'北京东路100-
2','210001','3321321','','3');
else
dbms_output.put_line('该门不存在');
end if;
end;
3
create or replace package TEST
is
procedure EmployeeAdd(p_employeeid char,p_name char,p_birthday date,p_sex number,p_address
char,p_zip char,p_phonenumber char,p_emailaddress char,p_departmentid char);
procedure Employeeupdate(empid char);
function check_id(id char) return number;
end;
六、实验体会和收获
在此次试验中,基本理解了过程、函数和程序包的基本概念,同时也理解过程中使用的输入、输出参数。基本了解函数和过程的区别。同时基本掌握储存过程和函数的编写和使用方法。在理解程序包的结构的时候,遇到了一些问题,对于程序包的编写和使用方法还是比较欠缺。在此次试验中遇到了一些问题,通过老师和同学的帮助,都得到了解决。
实验项目名称:触发器、安全管理、数据字典视图和审计实验学时: 3
同组学生姓名: 实验地点: B513
实验日期: 20##-6-1 实验成绩:
批改教师: 批改时间:
实验7 触发器、安全管理、数据字典视图和审计
一、实验目的和要求
1、了解触发器的特点和作用、理解触发器的组成部分以及触发器的类型。掌握触发器的编写方法。
2、了解数据库安全的基本概念。
3、理解用户与模式的区别。
4、理解权限的基本概念、掌握系统权限和用户权限的创建和使用方法。
5、理解角色的概念以及基于角色的安全特点,掌握创建角色的方法。
6、掌握使用概要文件实现数据库安全性的方法。
7、掌握使用数据字典视图查询有关信息的方法。
8、掌握使用审计跟踪用户对数据库操作的方法。
二、实验设备、环境
设备:奔腾Ⅳ或奔腾Ⅳ以上计算机
环境:WINDOWS 20## SERVER或WINDOWS 20## SERVER、ORACLE 10g中文版
三、实验步骤
1、分析题意,重点分析题目要求并给出解决方法。
2、根据题目要求启动SQL*Plus、iSQL*Plus、OEM等管理工具。
3、按题目要求完成实际操作任务,并将相关文档资料保存在以自己学号命名的文件夹中。
4、提交完成的实验结果。
四、实验内容
1、创建触发器
对于Orcl数据库,表Employees的DepartmentID列与表Departments的DepartmentID列应满足参照完整性规则,即:向Employees表添加一记录时,该记录的DepartmentID值在Departments表中应存在。修改Departments表中DepartmentID字段值时,该字段在Employees表中的对应值也应修改。
(1)删除Departments表中的一个记录时,该记录DepartmentID字段值在Employees表中对应的记录也应删除。对于上述参照完整性规则,在此通过触发器实现。在SQL*Plus或iSQL*Plus编辑窗口中输入该触发器的代码并执行。
(2)向Employees表中插入或修改一个记录时,通过触发器检查记录的值在Departments表中是否存在,若不存在,则取消插入或修改操作。
(3)修改Departments表的DepartmentID字段值时,该字段在Employees表中对应的值也做相应修改。
2、安全管理
(1)用户
在Orcl数据库中创建一个用户MANAGER,授予DBA角色和SYSDBA系统权限,它可以代替system系统用户。
(2)角色
在Orcl数据库中创建一个角色ADMIN,授予DBA角色和SYSDBA系统权限。
(3)概要文件
在Orcl数据库中创建概要文件Orcl_PROFILE 要求用户登录后立即修改口令,口令输入三次后不正确就锁定帐户,锁定时间为5天,将该概要文件分配给用户MANAGER。
3、数据字典视图
查询路线图、目录对象、回收站、约束和注释、索引和群集、抽象数据类型、数据库链接和物化等数据字典视图,了解这些视图分别记录了什么信息。
4、审计
(1)以SYS身份登录到OEM中,起用审计。
(2)使用户ADMIN的所有的更新操作都被审计。
(3)在对XS_KC表的插入、修改和删除的操作都要进行审计。
五、问题解答及实验结果
1-1
create trigger tr_bef_delete_dept
before delete on department
for each row
begin
delete from employees
where departmentid=:old.departmentid;
end;
1-2
create trigger tr_bef_insert_emp
before insert on employees
for each row
declare
depid number;
begin
select count(*) into depid
from department where departmentid=:new.departmentid;
if depid=0 then
raise_application_error(-20001,'部门表中没有该部门,不允许插入数据;');
end if;
end;
1-3
create trigger tr_aft_update_dept
after update on department
for each row
begin
update employees
set departmentid=:new.departmentid
where departmentid=:old.departmentid;
end;
2-1
create user u15
identified by u15;
grant create session,dba
to u15;
2-2
create role r15
identified by r15;
grant create session,dba to r15;
2-3
CREATE PROFILE "S08JBII15" LIMIT CPU_PER_SESSION DEFAULT
CPU_PER_CALL DEFAULT
CONNECT_TIME DEFAULT
IDLE_TIME DEFAULT
SESSIONS_PER_USER DEFAULT
LOGICAL_READS_PER_SESSION DEFAULT
LOGICAL_READS_PER_CALL DEFAULT
PRIVATE_SGA DEFAULT
COMPOSITE_LIMIT DEFAULT
PASSWORD_LIFE_TIME DEFAULT
PASSWORD_GRACE_TIME DEFAULT
PASSWORD_REUSE_MAX DEFAULT
PASSWORD_REUSE_TIME DEFAULT
PASSWORD_LOCK_TIME 5
FAILED_LOGIN_ATTEMPTS 3
PASSWORD_VERIFY_FUNCTION DEFAULT
3、路线图:column table_name format a30
column comments format a40 word_wrapped
select table_name,comments
from dict
where table_name like '%VIEWS%'
order by table_name;
4、(1) conn sys/zhao as sysdba
ALTER SYSTEM SET audit_trail=DB SCOPE=SPFILE;
(2)AUDIT UPDATE TABLE BY uS08JBII15
(3)audit insert,update,delete on XS_KC;
六、实验体会和收获
通过此次实验,不仅了解触发器的特点和作用,还理解触发器的组成部分以及触发器的类型。同时基本掌握了触发器的编写方法。也了解了数据库安全的基本概念,还理解用户与模式的区别。对于权限的基本概念、系统权限和用户权限的创建和使用方法也有了了解。
在理解角色的概念以及基于角色的安全特点的基础上,掌握了创建角色的方法及其使用概要文件实现数据库安全性的方法。也掌握了使用数据字典视图查询有关信息的方法。基本掌握了使用审计跟踪用户对数据库操作的方法。在此次实验中遇到了一些问题,在老师和同学的帮助下得到了解决。
实验项目名称:数据库备份与恢复、数据闪回技术和事务处理 实验学时: 3
同组学生姓名: 实验地点: B513
实验日期: 20##-6-8 实验成绩:
批改教师: 批改时间:
实验8 数据库备份与恢复、数据闪回技术和事务处理
一、实验目的和要求
1、理解数据库备份的意义、数据库逻辑备份与物理备份的区别以及各自适用的范围。
2、掌握数据库逻辑备份与恢复的方法。
3、掌握数据库物理备份中脱机备份(冷备份)以及恢复的方法。
4、掌握数据库物理备份中的联机备份(热备份)以及恢复的方法。
5、理解Oracle的数据库闪回技术适用范围及局限性,在闪回过程中基于SCN的闪回技术和基于时间戳的闪回技术。
6、掌握使用SQL *Plus命令闪回表、闪回删除和闪回数据库的方法
7、理解事务的概念及特性,事务的提交与回滚,保存点技术。掌握事务的完全回退和回退到保存点的方法。
二、实验设备、环境
设备:奔腾Ⅳ或奔腾Ⅳ以上计算机
环境:WINDOWS 20## SERVER或WINDOWS 20## SERVER、ORACLE 10g中文版
三、实验步骤
1、分析题意,重点分析题目要求并给出解决方法。
2、根据题目要求启动SQL*Plus、iSQL*Plus、OEM等管理工具。
3、按题目要求完成实际操作任务,并将相关文档资料保存在以自己学号命名的文件夹中。
4、提交完成的实验结果。
四、实验内容
1、数据库的逻辑备份与恢复
用EXP命令导出Orcl数据库中的Departments表。以mybak.dmp文件名存储在F盘的根目录下。然后删除该表中的数据。用IMP命令导入Departments表,查看表中的数据是否已经恢复。
2、数据库的物理备份
(1)冷备份
在F盘的oracle目录下,查找到Orcl子目录,将该目录中的数据、日志以及控制文件拷贝到E盘的BAK目录下(需要事先创建好)。然后删除Orcl子目录下的部分数据文件。启动数据库,观察其结果。
将E盘的BAK目录下的相应数据文件拷回到Orcl子目录下,启动数据库,观察其结果。
(2)热备份
首先将数据库改变为归档模式。
将ADMIN模式下的MYTS表空间进行备份。将ADMIN下的数据文件例如MYTE01数据文件拷贝到TEMP目录下。
将当前的联机日志进行归档和切换。(使用ALTER SYSTEM archive log CURRENT 命令和ALTER SYSTEM SWITCH LOG,FILE)
关闭数据库。将MYTS01数据文件删除。然后再启动数据库,观察出错信息。将错的文件脱机并删除掉。
打开数据库。此时将备份的文件拷贝到原来的路径下。恢复出错的文件,将该文件设置为联机。在察看结果,看是否已经恢复。
3、数据库的闪回技术
(1)闪回查询
(2)闪回表(注意:闪回表事先要进行允许行迁移的准备)
(3)闪回删除
4、事务管理
(1)回退全部事务
(2)利用保存点技术将事务回退的保存点处。
五、问题解答及实验结果
(1)导出
SQL> select *
2 from departments;
DEP DEPARTMENTNAME NOTE
--- -------------------------------------- ----------------
1 财务部
2 人力资源部
3 经理办公室
4 研发部
5 市场部
SQL> drop table departments;
表已删除。
SQL> select *
2 from departments;
from departments
*
第 2 行出现错误:
ORA-00942: 表或视图不存在
(2)导入
SQL> select *
2 from departments;
DEP DEPARTMENTNAME NOTE
--- -------------------- ----------------
1 财务部
2 人力资源部
3 经理办公室
4 研发部
5 市场部
2、物理备份
(1)冷备份
--查询控制文件所在的目录
set pagesize 30
col name for a60
select name from v$controlfile;
NAME
-------------------------------------------------------------------------------------
F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL01.CTL
F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL02.CTL
F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL03.CTL
--查询日志文件所在的目录
col member for a60
select member from v$logfile;
MEMBER
-----------------------------------------------------------------------------------
F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO03.LOG
F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02.LOG
F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01.LOG
--查询所有数据文件所在的目录和文件名
col file_name for a60
set linesize 120
FILE_NAME TABLESPACE_NAME
----------------------------------------------------------------------------------------------- ----------------------------
F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF USERS
F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF SYSAUX
F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF UNDOTBS1
F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF SYSTEM
F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\EXAMPLE01.DBF EXAMPLE
F:\DISK2\ORCL\PIONEER_DATA.DBF PIONEER_DATA
F:\DISK4\ORCL\PIONEER_INDX.DBF PIONEER_INDX
--查询参数文件所在的目录
show parameter pfile
NAME TYPE VALUE
----------- ------------------- ----------- -------------------------------------------------------------------------------
spfile string F:\ORACLE\PRODUCT\10.2.0\DB_1\ DBS\SPFILEORCL.ORA
--创建备份文件存放的目录
SQL>HOST --该命令从sqlplus窗口转换到dos窗口
f:\>md backup
f:\>cd backup
f:\backup>md database
f:\backup>md dbs
f:\backup>md disk2
f:\backup>md disk4
f:\backup>dir
--创建存储脚本文件的目录
f:\oracle>md mgt
--编写冷备份脚本文件:
CONNECT SYS/ORCL123 AS SYSDBA
SHUTDOWN IMMEDIATE
HOST COPY F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\*.* F:\backup\
HOST COPY F:\ORACLE\PRODUCT\10.2.0\db_1\dbs\SPFILEORCL.ORA F:\backup\dbs
HOST COPY F:\ORACLE\PRODUCT\10.2.0\db_1\database\pwdorcl.ora F:\dackup\database
HOST COPY F:\disk2\orcl\PINOEER_DATA.DBF F:\backup\disk2
HOST COPY F:\disk4\orcl\PINOEER_INDX.DBF F:\backup\disk4
STARTUP
将以上脚本保存在f:\oracle\mgt\coolbak.sql
--冷备份的实施,运行coolbak.sql
SQL>@F:\oracle\mgt\coolbak
--查看backup目录下的所有文件
SQL>HOST
F:\oracle\product\10.2.0\db_1\bin> cd f:\backup
f:\backup>dir
模拟数据损害,删除数据文件后,用下面的命令进行恢复。
SQL>connect sys/orcl123 as sysdba
SQL>shutdown immediate
SQL>HOST COPY F:\backup\*.* F:\oracle\product\10.2.0\oradata\orcl\
SQL>HOST COPY F:\backup\dbs\SPFILEORCL.ORA F:\oracle\product\10.2.0\dbackup_1\dbs\
SQL>HOST COPY F:\backup\database\PWDORCL.ORA F:\oracle\product\10.2.0\db_1\database\
SQL>HOST COPY F:\backup\disk2\PIONEER_DATA.DBF F:\DISK2\ORCL
SQL>HOST COPY F:\backup\disk4\PIONEER_INEX.DBF F:\DISK4\ORCL
SQL>STARTUP
(2)热备份
SQL> archive log list
数据库日志模式 非存档模式
自动存档 禁用
存档终点 USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列 11
当前日志序列 13
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area 209715200 bytes
Fixed Size 1248140 bytes
Variable Size 88081524 bytes
Database Buffers 117440512 bytes
Redo Buffers 2945024 bytes
数据库装载完毕。
SQL> alter database archivelog;
数据库已更改。
SQL> alter database open;
数据库已更改。
SQL> archive log list
数据库日志模式 存档模式
自动存档 启用
存档终点 USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列 31
下一个存档日志序列 33
当前日志序列 33
SQL> alter tablespace MYTS begin backup;
表空间已更改。
SQL> HOST COPY F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\MYTS01 F:\BACKUP;
SQL> ALTER TABLESPACE MYTS END BACKUP;
表空间已更改。
SQL> SHUTDOWN IMMEDIATE;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
模拟数据库损坏,删除MYTS01数据文件。
SQL> STARTUP
ORACLE 例程已经启动。
Total System Global Area 209715200 bytes
Fixed Size 1248140 bytes
Variable Size 130024564 bytes
Database Buffers 75497472 bytes
Redo Buffers 2945024 bytes
数据库装载完毕。
ORA-01157: 无法标识/锁定数据文件 8 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 8: 'F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\MYTS01'
SQL> alter database datafile 8 offline;
数据库已更改。
SQL> alter database open;
数据库已更改。
SQL> select file#,status from v$datafile;
FILE# STATUS
---------- -------
1 SYSTEM
2 ONLINE
3 ONLINE
4 ONLINE
5 ONLINE
6 ONLINE
7 ONLINE
8 OFFLINE
已选择8行。
SQL> col error for a20
SQL> select * from v$recover_file;
FILE# ONLINE ONLINE_ ERROR CHANGE# TIME
---------- ------- ------- -------------------- ---------- --------------------------------- ------
8 OFFLINE OFFLINE FILE NOT FOUND 0
SQL>HOST COPY F:\BACKUP\MYTS01 F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\
SQL> RECOVER DATAFILE 8
完成介质恢复。
SQL> ALTER TABLESPACE MYTS ONLINE;
表空间已更改。
SQL> SELECT FILE#,STATUS FROM V$DATAFILE;
FILE# STATUS
---------- ---------
1 SYSTEM
2 ONLINE
3 ONLINE
4 ONLINE
5 ONLINE
6 ONLINE
7 ONLINE
8 ONLINE
已选择8行。
SQL> CONNECT ADMIN/ADMIN123
已连接。
SQL> SELECT COUNT(*)
2 FROM SALES;
COUNT(*)
----------
918843
SQL> SELECT COUNT(*)
2 FROM customers;
COUNT(*)
----------
55500
3、数据库闪回技术
(1)闪回查询
SQL> CONNECT SYS/ORCL123 AS SYSDBA
已连接。
SQL> grant execute on dbms_flashback to scott;
授权成功。
SQL> SELECT TO_CHAR(sysdate,'yyyy-mm-dd hh24:mi:ss')current_time from dual;
CURRENT_TIME
-------------------
20##-06-05 17:08:53
SQL> conn scott/tiger;
已连接。
SQL> SELECT ENAME,SAL FROM EMP WHERE EMPNO=7788;
ENAME SAL
---------- ----------
SCOTT 3000
SQL> VARIABLE scn_now NUMBER
SQL> EXECUTE :scn_now :=dbms_flashback.get_system_change_number; --获取SCN的值。
PL/SQL 过程已成功完成。
SQL> PRINT :scn_now
SCN_NOW
----------
1297964
SQL> SET TIME ON
17:10:50 SQL> EXECUTE dbms_flashback.disable;
PL/SQL 过程已成功完成。
17:11:06 SQL> UPDATE EMP SET SAL=4000 WHERE EMPNO=7788;
已更新 1 行。
17:11:28 SQL> CONN SCOTT/TIGER
已连接。
17:11:49 SQL> EXECUTE :scn_now:=dbms_flashback.get_system_change_number;
PL/SQL 过程已成功完成。
17:12:16 SQL> PRINT :SCN_NOW
SCN_NOW
-----------------
1298061
17:12:33 SQL> EXECUT dbms_flashback.enable_at_system_change_number(:scn_now);
PL/SQL 过程已成功完成。
17:13:24 SQL> SELECT ENAME,SAL FROM EMP WHERE EMPNO=7788;
ENAME SAL
---------- ----------
SCOTT 4000
17:13:48 SQL> execute dbms_flashback.disable;
PL/SQL 过程已成功完成。
17:14:14 SQL> execute dbms_flashback.enable_at_system_change_number(1297964);
PL/SQL 过程已成功完成。
17:15:13 SQL> SELECT EMPNO,SAL FROM EMP WHERE EMPNO=7788;
EMPNO SAL
---------- ----------
7788 3000
17:15:34 SQL> EXECUTE dbms_flashback.disable;
PL/SQL 过程已成功完成。
17:16:07 SQL> UPDATE EMP SET SAL=4500 WHERE EMPNO=7788;
已更新 1 行。
17:16:27 SQL> COMMIT;
提交完成。
17:17:01SQL>EXECUTE dbms_flashback.enable_at_time( to_date('20##-06-05 17:13:48','yyyy-mm-dd hh24:mi:ss'));
PL/SQL 过程已成功完成。
17:19:09 SQL> SELECT EMPNO,SAL FROM EMP WHERE EMPNO=7788;
EMPNO SAL
---------- ----------
7788 4000
17:19:49 SQL> EXECUTE dbms_flashback.disable;
PL/SQL 过程已成功完成。
17:20:16 SQL> EXECUTE dbms_flashback.disable;
PL/SQL 过程已成功完成。
17:20:34 SQL> SET TIME OFF;
SQL>
(2)闪回表
一、创建闪回表的测试条件(创建一个表空间、一个用户,并给用户授权)
SQL> CREATE TABLESPACE loc_tbs01
2 DATAFILE 'e:\loc_tas01_1.dbf' SIZE 5M
3 EXTENT MANAGEMENT LOCAL;
表空间已创建。
SQL> CREATE USER myuser1 IDENTIFIED BY user1pswd
2 DEFAULT TABLESPACE loc_tbs01
3 TEMPORARY TABLESPACE temp
4 QUOTA 2M ON loc_tbs01;
用户已创建。
SQL> GRANT connect,resource TO myuser1;
授权成功。
SQL> GRANT execute ON dbms_flashback to myuser1;
授权成功。
二、模拟用户操作
SQL> connect myuser1/user1pswd;
已连接。
CREATE TABLE Department
(DeptNo CHAR(2) NOT NULL,
Name VARCHAR2(20) NOT NULL,
Address VARCHAR2(30),
CONSTRAINT PK_DepNO PRIMARY KEY (DeptNo) VALIDATE);
表已创建。
SQL> CREATE TABLE Student
(StuNo VARCHAR2(12) NOT NULL,
Name VARCHAR2(15) NOT NULL,
Sex CHAR(1),
DeptNo CHAR(2),
CONSTRAINT PK_StuNo PRIMARY KEY (StuNo) VALIDATE,
CONSTRAINT FK_DeptNO FOREIGN KEY (DeptNo) REFERENCES Department(DeptNo) VALIDATE);
表已创建。
SQL> COMMIT;
提交完成。
SQL> CREATE UNIQUE INDEX idx_Department ON Department(Name);
索引已创建。
SQL> CREATE INDEX idx_Student_name ON Student(Name);
索引已创建。
SQL> SELECT index_name,table_name,uniqueness FROM user_indexes;
INDEX_NAME TABLE_NAME UNIQUENES
------------------------------ ------------------------------ ---------
PK_DEPNO DEPARTMENT UNIQUE
IDX_DEPARTMENT DEPARTMENT UNIQUE
PK_STUNO STUDENT UNIQUE
IDX_STUDENT_NAME STUDENT NONUNIQUE
SQL> COMMIT;
--注意:先往Demartment表中插入数据,然后再向Student表插入数据,想一下为什么?
SQL> INSERT INTO Department
VALUES('01','计算机系','1号楼');
INSERT INTO Department
VALUES('02','自动控制系','2号楼');
INSERT INTO Department
VALUES('03','电子技术系','3号楼');
SQL>INSERT INTO Student
VALUES('20060302001','jack','1','03');
INSERT INTO Student
VALUES('20060302002','smith','1','03');
INSERT INTO Student
VALUES('20060302003','Iucy','0','03');
SQL> COMMIT;
三、采用基于时间点闪回表
SQL> VARIABLE scn_now number
SQL> EXECUTE :scn_now :=dbms_flashback.get_system_change_number; --获取SCN
PL/SQL 过程已成功完成。
SQL> PRINT scn_now
SCN_NOW
----------
1299435
SQL> ALTER TABLE Department ENABLE ROW MOVEMENT;
表已更改。
SQL> ALTER TABLE Student ENABLE ROW MOVEMENT;
表已更改。
SQL> SELECT TO_CHAR(sysdate,'yyyy-mm-dd hh24:mi:ss') CURRENT_TIME FROM dual;
CURRENT_TIME
-------------------
20##-06-05 17:42:41
SQL> TRUNCATE TABLE Student;
表被截断。
SQL> DROP INDEX idx_Department;
索引已删除。
SQL> DELETE FROM Department;
已删除3行。
SQL> COMMIT;
提交完成。
SQL> FLASHBACK TABLE Student TO TIMESTAMP to_timestamp('20##-06-05 17:42:41','yyyy-mm-dd hh24:mi:ss');
FLASHBACK TABLE Student TO TIMESTAMP to_timestamp('20##-06-05 17:42:41','yyyy-mm-dd hh24:mi:ss')
*
第 1 行出现错误:
ORA-01466: 无法读取数据 - 表定义已更改 --用TRUNCATE 命令截断的表不能闪回
SQL> FLASHBACK TABLE Department TO TIMESTAMP to_timestamp('20##-06-05 17:42:41','yyyy-mm-dd hh24:mi:ss');
闪回完成。 --闪回了Department表中的数据
SQL> COMMIT;
提交完成。
SQL> SELECT * FROM Student;
未选定行
SQL> SELECT * FROM Department;
DE NAME ADDRESS
-- -------------------- ------------------------------
01 计算机系 1号楼
02 自动控制系 2号楼
03 电子技术系 3号楼
SQL> SELECT index_name,table_name,uniqueness FROM user_indexes;
INDEX_NAME TABLE_NAME UNIQUENES
------------------------------ ------------------------------ ---------
PK_STUNO STUDENT UNIQUE
IDX_STUDENT_NAME STUDENT NONUNIQUE
PK_DEPNO DEPARTMENT UNIQUE
--虽然闪回了Department表中的数据但不能闪回单独删除的索引。
四、禁用行移动功能
SQL> ALTER TABLE Department ENABLE ROW MOVEMENT;
表已更改。
SQL> ALTER TABLE Student ENABLE ROW MOVEMENT;
表已更改。
(3)闪回删除
一、将测试环境恢复到初始状态
--用DROP TABLE TABLE_name CASCADE CONSTRAINT 命令删除表及其索引然后重新创建
SQL> DROP TABLE Student CASCADE CONSTRAINT;
表已删除。
SQL> DROP TABLE Department CASCADE CONSTRAINT;
表已删除。
--重新创建表
CREATE TABLE Department
(DeptNo CHAR(2) NOT NULL,
Name VARCHAR2(20) NOT NULL,
Address VARCHAR2(30),
CONSTRAINT PK_DepNO PRIMARY KEY (DeptNo) VALIDATE);
表已创建。
CREATE TABLE Student
(StuNo VARCHAR2(12) NOT NULL,
Name VARCHAR2(15) NOT NULL,
Sex CHAR(1),
DeptNo CHAR(2),
CONSTRAINT PK_StuNo PRIMARY KEY (StuNo) VALIDATE,
CONSTRAINT FK_DeptNO2 FOREIGN KEY (DeptNo) REFERENCES Department(DeptNo) VALIDATE);
表已创建。
SQL> COMMIT;
提交完成。
SQL> CREATE UNIQUE INDEX idx_Department ON Department(Name);
索引已创建。
SQL> CREATE INDEX idx_Student_name ON Student(Name);
索引已创建。
--向Department表插入数据
INSERT INTO Department VALUES('01','计算机系','1号楼');
INSERT INTO Department VALUES('02','自动控制系','2号楼');
INSERT INTO Department VALUES('03','电子技术系','3号楼');
--向Student表插入数据
INSERT INTO Student
VALUES('20090601001','jack','1','03');
INSERT INTO Student
VALUES('20090601002','smith','1','03');
INSERT INTO Student
VALUES('20090601003','Iucy','0','03');
二、创建一个触发器
CREATE OR REPLACE TRIGGER tr_Student_ActionTime
BEFORE insert OR update OR delete ON Student
BEGIN
IF (TO_CHAR(sysdate,'DAY') IN ('星期六','星期天'))
OR (TO_CHAR(sysdate,'HH24') NOT BETWEEN 8 AND 18 ) THEN
RAISE_APPLICATION_ERROR(-20001,'不是上班时间,不能修改Student表');
END IF;
END;
/
触发器已创建
三、清除回收站,查询删除表之前的表、索引、触发器的信息。
--清空回收站内容
SQL> PURGE RECYCLEBIN;
回收站已清空。
SQL> SELECT table_name,tablespace_name FROM user_tables;
TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
STUDENT LOC_TBS01
DEPARTMENT LOC_TBS01
SYS_TEMP_FBT
SQL> SELECT index_name,table_name,uniqueness FROM user_indexes ORDER BY table_name;
INDEX_NAME TABLE_NAME UNIQUENES
------------------------------ ------------------------------ ---------
PK_DEPNO DEPARTMENT UNIQUE
IDX_DEPARTMENT DEPARTMENT UNIQUE
PK_STUNO STUDENT UNIQUE
IDX_STUDENT_NAME STUDENT NONUNIQUE
SQL> SELECT trigger_name,trigger_type,table_name FROM user_triggers;
TRIGGER_NAME TRIGGER_TYPE TABLE_NAME
------------------------------ ---------------- --------------------------------------------------
TR_STUDENT_ACTIONTIME BEFORE STATEMENT STUDENT
四、模拟用户进行数据库操作,删除Student表和Department表
SQL> DROP TABLE Student CASCADE CONSTRAINT;
表已删除。
SQL> DROP TABLE Department CASCADE CONSTRAINT;
表已删除。
五、查看删除表以后的效果
SQL> desc user_recyclebin;
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
OBJECT_NAME NOT NULL VARCHAR2(30)
ORIGINAL_NAME VARCHAR2(32)
OPERATION VARCHAR2(9)
TYPE VARCHAR2(25)
TS_NAME VARCHAR2(30)
CREATETIME VARCHAR2(19)
DROPTIME VARCHAR2(19)
DROPSCN NUMBER
PARTITION_NAME VARCHAR2(32)
CAN_UNDROP VARCHAR2(3)
CAN_PURGE VARCHAR2(3)
RELATED NOT NULL NUMBER
BASE_OBJECT NOT NULL NUMBER
PURGE_OBJECT NOT NULL NUMBER
SPACE NUMBER
SQL> SET pagesize 40 linesize 120 --设置页面的相关参数
SQL> SELECT object_name,original_name,type,droptime,dropscn
FROM user_recyclebin
ORDER BY type;
OBJECT_NAME ORIGINAL_NAME TYPE DROPTIME DROPSCN
---------------------------------------------------- -------------------------- ------------ ----------------------- ---------------
BIN$Y45MPdicTsiziSrIP7obzA==$0 PK_EMP INDEX 20##-06-05:18:55:14 1303894
BIN$AjwfyOGlTo+WuwuYGF63Mw==$0 PK_DEPT INDEX 20##-06-05:19:04:25 1304387
BIN$XqepipUrTleQ/2rRXCmuAA==$0 DEPARTMENTS TABLE 20##-06-05:19:04:25 1304391
BIN$RPTru9OXSmeOzHPv+DC7mg==$0 Student TABLE 20##-06-05:18:55:14 1303898
说明:OBJECT_NAME--回收站中的对象名
ORIGINAL_NAME--原来的对象名
DROPSCN--删除时的系统改变编号
六、闪回删除表
SQL> FLASHBACK TABLE Department TO BEFORE DROP;
闪回完成。
SQL>FLASHBACK TABLE Student TO BEFORE DROP;
闪回完成。
SQL>select * from Department;
SQL>select * from Student;
4、事务管理
(1)回退事务
SQL> set linesize 120
SQL> /
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------------- ---------- -------------- ---------- ---------- ----------- ----------------
7788 SCOTT ANALYST 7566 19-4月 -87 4500 20
SQL> update emp
2 set sal=3000;
已更新14行。
SQL> rollback;
回退已完成。
SQL> select empno,sal
2 from emp;
EMPNO SAL
---------- ----------
7369 800
7499 1600
7521 1250
7566 2975
7654 1250
7698 2850
7782 2450
7788 4500
7839 5000
7844 1500
7876 1100
EMPNO SAL
---------- ----------
7900 950
7902 3000
7934 1300
已选择14行
六、实验体会和收获
通过此次实验,理解了数据库备份的意义以及如何对数据库逻辑备份与物理备份,也知道了他们的区别以及各自适用的范围。同时也掌握数据库逻辑备份与恢复的方法。对于数据库物理备份中脱机备份(冷备份)以及恢复的方法也有了了解。及其数据库物理备份中的联机备份(热备份)以及恢复的方法。理解了Oracle的数据库闪回技术适用范围及局限性,在闪回过程中基于SCN的闪回技术和基于时间戳的闪回技术。还基本掌握了使用SQL *Plus命令闪回表、闪回删除和闪回数据库的方法。也理解了事务的概念及特性,事务的提交与回滚,保存点技术,还掌握事务的完全回退和回退到保存点的方法。在此次实验中,没有能在数据服务器上运行,不过通过看了老师发的资料,有了一定的了解。