數據庫實驗三 存儲過程與觸發器

一、實驗目的
(1)瞭解存儲過程的概念、優點
(2)熟練掌握創建存儲過程的方法
(3)熟練掌握存儲過程的調用方法
(4)瞭解觸發器的概念、優點
(5)掌握觸發器的方法和步驟
(6)掌握觸發器的使用
二、實驗環境
PLSQL Developer 12
Oracle Database 11 home
三、實驗步驟、出現的問題及解決方案
實驗步驟:
1、建立存儲過程完成圖書管理系統中的借書功能,並調用該存儲過程實現借書功能。
功能要求:
 借書時要求輸入借閱流水號,借書證號,圖書編號。(即該存儲過程有3個輸入參數)
 借書時,借書日期爲系統時間。
 圖書的是否借出改爲“是”。
 調用存儲過程實現借書證號“20051001”借出圖書編號爲“1005050”的圖書。
創建儲存過程:
CREATE OR REPLACE PROCEDURE 借書(借閱流水號 VARCHAR,借書證號 VARCHAR,圖書編號 VARCHAR)
AS
BEGIN
INSERT INTO 借閱 VALUES(借書.借閱流水號,借書.借書證號,借書.圖書編號,TO_DATE(TO_CHAR(SYSDATE,‘YYYY/MM/DD’),‘YYYY/MM/DD’),’’,’’,’’);
UPDATE 圖書 SET 是否借出=‘是’ WHERE 圖書.圖書編號=借書.圖書編號;
COMMIT;
END;
調用儲存過程:
CALL 借書(‘7’,‘20051001’,‘1005050’);
調用前:
在這裏插入圖片描述
在這裏插入圖片描述
調用後:
在這裏插入圖片描述
在這裏插入圖片描述
2、建立存儲過程完成圖書管理系統中的預約功能。
 預約時要求輸入預約流水號,借書證號,ISBN。(即該存儲過程有3個輸入參數)
 存儲過程先檢查輸入的ISBN版本的圖書是否都已借出,如果是則進行預約,否則提示“該書目有可借圖書,請查找”。
 預約時間爲系統時間。
 調用存儲過程實現借書證號“20081237”預約ISBN爲“9787508040110”的圖書。
創建儲存過程:
CREATE OR REPLACE PROCEDURE 預約圖書(預約流水號 VARCHAR,借書證號 VARCHAR,ISBN VARCHAR)
AS
預約結果 INT;
BEGIN
SELECT COUNT(*) INTO 預約結果
FROM 圖書
WHERE 圖書.ISBN=預約圖書.ISBN AND 圖書.是否借出=‘否’;
IF 預約結果!=0
THEN
DBMS_OUTPUT.PUT_LINE(‘該書目有可借圖書,請查找’);
ELSE
INSERT INTO 預約 VALUES(預約圖書.預約流水號,預約圖書.借書證號,預約圖書.ISBN,TO_DATE(TO_CHAR(SYSDATE,‘YYYY/MM/DD’),‘YYYY/MM/DD’));
COMMIT;
END IF;
END;
調用儲存過程:
CALL 預約圖書(‘2’,‘20081237’,‘9787508040110’);
調用前:
在這裏插入圖片描述
調用後:
在這裏插入圖片描述
3、建立存儲過程完成圖書管理系統中的還書功能。
 還書時要求輸入借書證號,圖書編號,罰款分類號(即該存儲過程有3個輸入參數)。
 還書日期爲系統時間。
 圖書的是否借出改爲‘否’。
 調用存儲過程實現借書證號“20051001”歸還圖書編號爲“1005050”的圖書。
創建儲存過程:
CREATE OR REPLACE PROCEDURE 還書(借書證號 VARCHAR,圖書編號 VARCHAR,罰款分類號 VARCHAR)
AS
BEGIN
UPDATE 借閱
SET 借閱.歸還日期=TO_DATE(TO_CHAR(SYSDATE,‘YYYY/MM/DD’),‘YYYY/MM/DD’),借閱.罰款分類號=還書.罰款分類號
WHERE 借閱.借書證號=還書.借書證號 AND 借閱.圖書編號=還書.圖書編號;
UPDATE 圖書 SET 是否借出=‘否’ WHERE 圖書.圖書編號=還書.圖書編號;
COMMIT;
END;
調用儲存過程:
CALL 還書(‘20051001’,‘1005050’,‘1’)
調用前:
在這裏插入圖片描述
在這裏插入圖片描述
調用後:
在這裏插入圖片描述
在這裏插入圖片描述
4、通過序列和觸發器實現借閱表中借閱流水號字段的自動遞增。
創建序列:
CREATE SEQUENCE 借閱流水號序列 START WITH 8;–創建序列,並且從8開始
創建觸發器:
CREATE OR REPLACE TRIGGER 自動遞增
BEFORE INSERT ON 借閱
FOR EACH ROW
BEGIN
SELECT 借閱流水號序列.NEXTVAL INTO :NEW.借閱流水號 FROM DUAL;
END;
5、修改借書功能的存儲過程。
該存儲過程要求:
(1)借書時輸入借書證號,圖書編號。(即該函數有2個輸入參數)
(2)借書時,借書日期爲系統時間。
*該存儲過程主體部分只有insert into語句。
修改儲存過程:
CREATE OR REPLACE PROCEDURE 借書(借書證號 VARCHAR,圖書編號 VARCHAR)
AS
BEGIN
INSERT INTO 借閱 VALUES(’’,借書.借書證號,借書.圖書編號,TO_DATE(TO_CHAR(SYSDATE,‘YYYY/MM/DD’),‘YYYY/MM/DD’),’’,’’,’’);
COMMIT;
END;
6、建立與借書存儲過程相對應的觸發器,當借閱表中加入借閱信息時,該觸發器觸發,自動修改所借圖書的是否借出改爲‘是’。
創建觸發器:
CREATE OR REPLACE TRIGGER 自動是否借出
AFTER INSERT ON 借閱
FOR EACH ROW
BEGIN
UPDATE 圖書 SET 是否借出=‘是’ WHERE 圖書.圖書編號=:NEW.圖書編號;
END;
調用修改後的借書儲存過程以及激活觸發器:
CALL 借書(‘20051001’,‘1005050’);
CALL 借書(‘20051001’,‘2001231’);
調用前:
在這裏插入圖片描述
在這裏插入圖片描述
調用後:
在這裏插入圖片描述在這裏插入圖片描述
出現的問題及解決方案:
1、PLSQL創建儲存過程編譯出錯不會給出錯誤提示,導致調用時提示儲存過程處於無效狀態。解決方案:使用SQLPLUS,不過SQLPLUS只會提示編譯錯誤,不會提示具體原因,還可以使用Navicat工具,Navicat會給出更加詳細的錯誤原因,僅供參考。
2、創建儲存過程時,設置變量參數類型時,指定了字符長度導致創建失敗。解決方案:直接設置變量數據類型,不設置其字符長度。
3、使用TO_DATE(SYSDATE,‘YYYY/MM/DD’)獲取當前日期作爲借閱日期導致調用借書儲存過程失敗,提示參數類型錯誤。解決方案:因爲TO_DATE()函數是將字符類型轉換成日期類型,而SYSDATE本來就是日期類型,所以導致調用失敗,使用TO_DATE(TO_CHAR(SYSDATE,‘YYYY/MM/DD’),‘YYYY/MM/DD’)將SYSDATE轉換成字符類型再轉換成日期類型。
4、使用DBMS_OUTPUT.PUT_LINE()函數輸出提示,沒有反應。解決方案:在SQLPLUS中需要先使用SET SERVEROUTPUT ON;打開輸出模式才能看見輸出,而在PLSQL中輸出的內容在另一個Output窗口中,而不是沒有反應。
5、創建自動遞增借閱流水號的觸發器時,使用NEW關鍵字改變借閱流水號,導致創建觸發器失敗,解決方案:使用NEW關鍵字時,需要在前面加一個“:”號,如“:NEW.借閱流水號”。
6、調用修改後的借書儲存過程時,發送錯誤,提示違反唯一約束條件以及COMMIT;不能再觸發器中使用。解決方案:刪除在觸發器中的COMMIT;,然後刪除序列“借閱流水號序列”,重新創建序列“借閱流水號序列”,並且設置初始值爲8,因爲借閱表中已經有借閱流水號1到7的數據了,然後創建序列時未指定初始值,序列默認從1開始,導致違反唯一約束條件,從而導致調用儲存過程失敗。
四、實驗心得體會
通過本次實驗,學會了儲存過程以及觸發器和序列的使用方法,對存儲過程有了一個直觀的認識,對觸發器的工作原理和作用有了更加深刻的認識,使用觸發器可以在修改數據前後規範數據,使數據規範化和標準化。使用儲存過程將一系列的相關聯的數據庫操作封裝成一個儲存過程,使數據庫操作更加簡便,數據修改更加規範,數據庫設計更加嚴謹。

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