一.實驗目標
通過理論學習與實驗設計,使自己具備如下能力:
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;
表更新成功: