【正文】
N(ISBN,BookID)values(39。)GOinsert BookID_ISBN(ISBN,BookID)values(39。)GOinsert BookID_ISBN(ISBN,BookID)values(39。)GOinsert BookID_ISBN(ISBN,BookID)values(39。)GOinsert BookID_ISBN(ISBN,BookID)values(39。)GO》》》insert BookID_ISBN(ISBN,BookID)values(39。)GOinsert BookID_ISBN(ISBN,BookID)values(39。)GOinsert BookID_ISBN(ISBN,BookID)values(39。)GOinsert BookID_ISBN(ISBN,BookID)values(39。)GOinsert BookID_ISBN(ISBN,BookID)values(39。)GO》》》insert BookID_ISBN(ISBN,BookID)values(39。)GOinsert BookID_ISBN(ISBN,BookID)values(39。)GOinsert BookID_ISBN(ISBN,BookID)values(39。)GOinsert BookID_ISBN(ISBN,BookID)values(39。)GOinsert BookID_ISBN(ISBN,BookID)values(39。)GO》》》insert BookID_ISBN(ISBN,BookID)values(39。)GOinsert BookID_ISBN(ISBN,BookID)values(39。)GO》》》insert BookID_ISBN(ISBN,BookID)values(39。)GOinsert BookID_ISBN(ISBN,BookID)values(39。)GO/* MBook203 中創(chuàng)建讀者加密的借書存儲(chǔ)過(guò)程,當(dāng)向 Lend 表插入一條記錄時(shí), ①檢查該記錄的借書證號(hào) ReaderID 在 Reader 表中是否存在, ②檢查該記錄的圖書 ISBN 號(hào)是否在 Book 表中是否存在, ③檢查該記錄的圖書庫(kù)存量 Invnum 是否 等于 0 ④檢查該記錄是否借閱過(guò) 該圖書 ⑤檢查該記錄的 圖書 BookID 是否在 借閱表 Lend 中已經(jīng)存在 若有一項(xiàng)為否,則不允許插入,并回滾事務(wù); 否則,插入記錄,并將 讀者表中該讀者借閱數(shù)量 加1 ,圖書表中庫(kù)存量 減1 ,并返回借書成功信息*/USE MBook203GOIF EXISTS(SELECT name FROM WHERE name = 39。 RETURN 0 END IF (SELECT Invnum FROM Book WHERE ISBN = in_ISBN) = 0 BEGIN SET out_str = 39。 RETURN 0 END /* 更新圖書庫(kù)存量 */ UPDATE Book SET Invnum = Invnum 1 WHERE ISBN = in_ISBN IF ERROR = 0 /* 如果所有語(yǔ)句都不出錯(cuò),則提交事務(wù)并返回 */ BEGIN COMMIT TRAN SET out_str = 39。 RETURN 0 END BEGIN TRAN /* 開(kāi)始一個(gè)事務(wù) */ DECLARE bbt date SELECT bbt = (SELECT bbt FROM Lend WHERE ReaderID = in_ReaderID AND ISBN = in_ISBN AND BookID = in_BookID ) /* 將還書記錄插入到歷史借閱表 */ INSERT INTO HistoryLend VALUES(in_ReaderID,in_ISBN,in_BookID,bbt,GETDATE()) IF ERROR 0 /* 如果前面一條 SQL 語(yǔ)句出錯(cuò)則回滾事務(wù)并返回 */ BEGIN ROLLBACK TRAN SET out_str = 39。 RETURN 1 END ELSE /*如果執(zhí)行出錯(cuò),則回滾事務(wù)并返回*/ BEGIN ROLLBACK TRAN SET out_str = 39。,out_str OUTPUTSELECT out_str/*執(zhí)行刪除借閱表 Lend 一條借書記錄的存儲(chǔ)過(guò)程(還書)*/USE MBook203GODECLARE out_str char(30)EXEC Book_Return 39?! ?③計(jì)算應(yīng)還書日期可用DATEADD函數(shù),其語(yǔ)法格式為: DATEADD (datepart , number, date ) 其中:datepart是指與number相加的date部分,取值可以是YY、M、D、W等。 ⑤列出歷史借閱表中有超期未歸還圖書的還書記錄(Book_History_Overdue) */USE MBook203GOIF EXISTS(SELECT name FROM WHERE name = 39。)DROP PROC Book_History_OverdueGOCREATE PROCEDURE Book_History_Overdue Book_History_Overdue_Cursor CURSOR VARYING OUTPUT, out_str char(50) OUTPUT WITH ENCRYPTION ASBEGIN IF EXISTS( SELECT FROM (SELECT ReaderID,Name FROM Reader )R,(SELECT ReaderID,BookID,ISBN,bbt,rbbt FROM HistoryLend )H,(SELECT ISBN,Bname FROM Book)B WHERE = AND = AND DATEDIFF(DAY,) 90 ) BEGIN SET out_str = 39。%39。%39。)DROP PROCEDURE Reader_Current_LendGOCREATE PROCEDURE Reader_Current_Lend Reader_Current_Lend_Cursor CURSOR VARYING OUTPUT, in_ReaderID char(12)=null,in_Name varchar(8)=null,out_str char(30) OUTPUT WITH ENCRYPTIONASBEGIN IF EXISTS ( SELECT ,dept,name,Num,Bname FROM (SELECT ReaderID,Dept,Name,Num FROM Reader WHERE ReaderID = in_ReaderID) R,Lend L,Book B WHERE = AND = ) BEGIN SET out_str = 39。,39。,39。,out_str OUTPUTSELECT out_strGODECLARE out_str char(30)EXEC Book_Borrow 39。,39。,39。,out_str OUTPUTSELECT out_strGODECLARE out_str char(30)EXEC Book_Borrow 39。,39。,39。,out_str OUTPUTSELECT out_strGO②測(cè)試,當(dāng)圖書表中 圖書庫(kù)存量為0 時(shí),ISBN 號(hào)為:9787121083,Java 編程思想讀者 200807014202 繼續(xù)借閱該書時(shí):DECLARE out_str char(30)EXEC Book_Borrow 39。 RETURN 0 ENDEND/* ,執(zhí)行(Reader_Current_Lend)存儲(chǔ)過(guò)程*/USE MBook203GODECLARE out_str char(30),MyCursor CURSOR,ReaderID char(12)SET ReaderID = 39。JAVA39。以下為檢索到的相關(guān)圖書信息:39。 RETURN 0 ENDEND/* 當(dāng)前借閱表 中超期未歸還圖書的 借書記錄 存儲(chǔ)過(guò)程*/USE MBook203GODECLARE out_str char(50),MyCursor CURSOREXEC Book_Current_Overdue Book_Current_Overdue_Cursor = MyCursor OUTPUT,out_str = out_str OUTPUTSELECT out_strFETCH NEXT FROM MyCursorWHILE(FETCH_STATUS = 0) BEGIN FETCH NEXT FROM MyCursor ENDCLOSE MyCursorDEALLOCATE MyCursor/* 歷史借閱表 中超期未歸還圖書的 還書記錄 存儲(chǔ)過(guò)程*/USE MBook203GODECLARE out_str char(50),MyCursor CURSOREXEC Book_History_Overdue Book_History_Overdue_Cursor = MyCursor OUTPUT,out_str = out_str OUTPUTSELECT out_strFETCH NEXT FROM MyCursorWHILE(FETCH_STATUS = 0) BEGIN FETCH NEXT FROM MyCursor ENDCLOSE MyCursorDEALLOCATE MyCursor/*8.用戶自定義書籍檢索存儲(chǔ)過(guò)程,用于實(shí)現(xiàn)根據(jù) 圖書名稱 或 作者姓名 的模糊查詢 返回圖書有關(guān)信息。 SET Book_Current_Overdue_Cursor = CURSOR DYNAMIC /*設(shè)置輸出游標(biāo)類型為 動(dòng)態(tài)游標(biāo)*/ FOR SELECT ,GETDATE() 當(dāng)前日期 FROM (SELECT ReaderID,Name FROM Reader )R,(SELECT ReaderID,BookID,ISBN,bbt FROM Lend )L, (SELECT ISBN,Bname FROM Book)B WHERE = AND = AND DATEDIFF(DAY,GETDATE()) 90 OPEN Book_Current_Overdue_Cursor /*打開(kāi)游標(biāo)*/ RETURN 1 END ELSE BEGIN SET out_str = 39。201381039。,39。,39。 RETURN 0 END /* 更新讀者借閱數(shù)量 */ UPDATE Reader SET Num = Num 1 WHERE ReaderID = in_ReaderID IF ERROR 0 BEGIN ROLLBACK TRAN SET out_str = 39。 RETURN 0 ENDEND/* MBook203 中創(chuàng)建讀者加密的還書存儲(chǔ)過(guò)程,當(dāng)刪除 Lend 表中一條記錄時(shí): ①檢查借閱表中是否存在該借閱記錄,如果不存在則回滾事務(wù) ②將該記錄插入到歷史借閱表 ③將該記錄的還書日期 rbbt 獲取當(dāng)前系統(tǒng)時(shí)間,并插入到對(duì)應(yīng)記錄的還書日期字段 ④將該記錄的讀者借閱數(shù)量 加1 ⑤檢查該記的圖書庫(kù)存量 加1 ⑥返回還書成功信息 若有一項(xiàng)為執(zhí)行不成功,則不允許刪除,并回滾事務(wù) */USE MBook203GOIF EXISTS(SELECT name FROM WHERE name = 39。 RETURN 0 END BEGIN TRAN /* 開(kāi)始一個(gè)事務(wù) */ INSERT INTO Lend VALUES(in_ReaderID,in_ISBN,in_BookID,GETDATE()) IF ERROR 0 /* 如果前面一條 SQL 語(yǔ)句出錯(cuò)則回滾事務(wù)并返回 */ BEGIN ROLLBACK TRAN SET out_str = 39。 RETURN 0 END IF NOT EXISTS(SELECT * FROM Book WHERE ISBN = in_ISBN) BEGIN SET out_str = 39。)GOinsert BookID_ISBN(ISBN,BookID)values(39。)GOinsert BookID_ISBN(ISBN,BookID)values(39。)GOinsert BookID_ISB