数据库原理实验四

一.实验目标

通过理论学习与实验设计,使自己具备如下能力:

1.将数学、自然科学、工程基础和专业知识用于解决软件工程相关领域的复杂工程问题的能力。
2.针对数据库应用领域的具体情况,提出数据库的设计方案,并对其进行规范的能力。
选用合适的数据库管理工具承担数据库系统的实施与维护工作的能力。

二.实验项目

1. 登录SQLPlus,开始第1个会话,自动开始一个事务。查询10号部门的雇员姓名、工资与部门号,执行命令:
select ename,sal,deptno from emp where deptno=10;

显示结果如下:

2. 将10号部门的雇员工资增加1000,执行命令:
update emp set sal=sal+1000 where deptno=10;

显示信息:

3. 查询修改后10号部门的雇员姓名、工资与部门号,执行命令:
select ename,sal,deptno from emp where deptno=10;

显示结果如下:

4. 设置检查点sp1,执行命令:
savepoint sp1;
5.将10号部门的雇员KING的工资再增加10000,执行命令:
update emp set sal=sal+10000 where deptno=10 and ename='KING';

显示信息:1行已更新

6.查询修改后10号部门的雇员姓名、工资与部门号,执行命令:
select ename,sal,deptno from emp where deptno=10;

显示结果如下:

7.回退到检查点sp1,执行命令:
rollback to sp1;

显示信息:回退完成

8.查询回退后10号部门的雇员姓名、工资与部门号,执行命令:
select ename,sal,deptno from emp where deptno=10;

显示结果如下:

注意数据的变化。
通过观察实验现象发现:再次查询10号部门的雇员姓名、工资与部门号,发现数据并没有回滚,实验项目3做的更新仍然有效,但是实验项目5“将10号部门的雇员KING的工资再增加10000”已经无效,10号部门雇员的工资发生了改变。

9. 保持本SQLPlus中的连接,再开一个CMD窗口登录SQLPlus,开始第2个会话,自动开始另一个事务,查询10号部门的雇员姓名、工资与部门号,执行命令:
select ename,sal,deptno from emp where deptno=10;

显示结果如下:

注意:显示结果与第1步一样,但与第8步不一样。为什么?
原因:因为在第一个cmd窗口执行的操作并没有提交到数据库,故而之前在第一个cmd窗口的操作数据被覆盖了。

10.在第2个会话中执行命令:
update emp set sal=sal*10 where deptno=10;

这时,第2个会话在等待,没有显示任何信息。

11.在第1个会话中执行回退命令:
Rollback;

这时,再观察第2个会话,显示信息:已更新3行

12.在第2个会话中执行命令:
select ename,sal,deptno from emp where deptno=10;

显示结果如下:

注意:显示结果是在第9步的基础上更新的。

13.在第1个会话中执行命令:
select ename,sal,deptno from emp where deptno=10;

显示结果如下:

注意:显示结果已恢复到初始状态,与第12步的结果不一样。

14.在第2个会话中执行命令:
Rollback;

显示信息:回退已完成。

再执行命令select ename,sal,deptno from emp where deptno=10;,观察显示结果。

重复以上过程,但将第11步与第14步的rollback替换成commit,注意观察显示结果。
将rollback改为commit后12步和13步结果一样。

三.实验错误解决方案

问题一: ORA-00903问题
1、问题的出现
在实验项目10中创建“专业”表,SQL语句如下:

update emp set sal=sal*10 where deptno=10;

出现错误:
ORA-014338: 值大于为此列指定的允许精度

2、问题分析

错误出现在第1行,表明更新sal的值有问题。通过desc查询表的结构发现表最多表示5位正数也就sal的最大值为99999,而,更新sal*10后超过了这个精度,所以更新失败所以出错。

3、解决方案
解决方案如下:
将sal的表示位number(7,2)改为number(8,2)。
SQL语句如下:

Alter table emp modify(sal number(8,2));

执行该语句后,表已修改,问题解决。

问题二: ORA-02290问题 违反检查约束条件
在实验项目10中创建“专业”表,SQL语句如下:

  update emp set sal=sal*10 where deptno=10;

2、问题分析
出现该问题的原因是在实验二项目2(a)a.工资介于5000到100000之间

alter table EMP
add constraint chk_EMP_SAL check(SAL between 5000 and 100000);

为sal定义了约束条件,sal在5000到100000之间,所以更新不成功。

3、解决方案
删除实验2的约束条件。SQL语句如下:

Alter table emp
Drop constraint chk_emp_sal;

再次执行update操作:update emp set sal=sal*10 where deptno=10;
表更新成功:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章