江南大学物联网工程学院数据库课程实验二作业2实验报告
一、開發環境
DBMS: Microsoft SQL Server 2019 (64- bit)
可視化管理工具: Microsoft SQL Server
Management Studio- 18.10
二、代碼、注釋及測試
第三題
--創建客戶表并且添加數據 create table customers( cnum varchar(5) primary key, --將客戶編號設置為 主鍵,使其具有完整性 cname varchar(5) not null, --非空約束(下同) lname varchar(5) not null, cadres varchar(30) not null, cpos_code varchar(10) not null, lphone varchar(12) not null ); insert into customers --values('0001','葉民','Yeman','桃園公寓 ','214000','17851313918') --values('0002','Lily','Lily','gym','214026','1525188390 8') values('0003','Tom','Tom','KFC','214142','15253343 900'); --創建存儲過程 create proc get_cus_info (@cpos varchar(6)) --有一個 in 輸入的局部變量 as begin --可以直接獲取滿足條件的結果,concat 單 行函數為拼接字符串功能,like 模糊查詢 select * from customers where cpos_code like (concat('%',@cpos)) end --執行存儲過程 --將'124'作為 in 參數輸入,即獲取郵編尾號是'142'的客戶信息 exec get_cus_info '142'第四題
--創建學生表并添加測試數據 create table s( snum varchar(4) primary key, --設置學號為主鍵, 使其具有完整性 sname varchar(5) not null, --非空約束 age int, dept varchar(15) ); insert into s --values('001','張三',22,'物聯網工程學院'); --values('002','王四',21,'計算機學院'); --values('003','李五',19,'生命工程學院'); values('004','趙六',19,'醫學院'); --創建課程表并添加測試數據 create table c( cnum varchar(4) primary key, --設置課程號為主 鍵,使其具有完整性 cname varchar(10) not null, --非空約束(下同) teacher varchar(5) not null ); insert into c --values('C1','Java','楊均') --values('C2','數據庫','馬振') --values('C3','計算方法','江楠') values('C4','數據結構','陳帆') --創建選課表并添加測試數據 create table sc( snum varchar(4), cnum varchar(4), score int, foreign key (snum) references s(snum), --設置外鍵 約束,該表中的 snum 需要在 s 表中存在 foreign key (cnum) references c(cnum), --設置外 鍵約束,該表中的 cnum 需要在 c 表中存在 unique (snum,cnum) --設置(snum,cnum)組合 唯一,即該表中不能存在 snum 和 cnum 都相同的 數據 ); insert into sc --values('001','C1',98) --values('002','C1',89) --values('003','C1',93) --values('001','C2',92) --values('002','C2',98) --values('003','C2',96) --values('004','C3',96) --創建觸發器 create trigger check_legalsc on sc --基于 sc 選課表 after insert --在添加后觸發 as declare @curc_count varchar(4) --獲取添加的課程編號 select @curc_count = cnum from inserted declare @curs_snum varchar(4) --獲取添加的學生學號 select @curs_snum = snum from inserted --檢查學號是否存在 s 表 if @curs_snum in (select snum from s) begin --檢查課程編號是否存在 c 課程表且未 被選滿(這里設置滿為 2) if 2 >= (select COUNT(*) from sc where cnum = @curc_count) and @curc_count in (select cnum from c) begin select '恭喜你,選課成功!' as '結 果' end else begin --回滾﹐避免加入 rollback transaction select '對不起,該課程人數已 滿!' as '結果' end end else begin rollback transaction --回滾﹐避免加入 select '你好,你沒有選改課的權限!' as '結果' end --測試觸發器 --①成功情況 insert into sc(snum,cnum) values('001','C3') --②失敗情況 1:課程已滿 insert into sc(snum,cnum) values('004','C1') --③失敗情況 2:學生學號不在 s 表中 insert into sc(snum,cnum) values('005','C4')三、小結
①存儲過程可以一次編譯多次使用。存儲過程只在創建時進行編譯,之后的使用都不需要重新編譯,這就提升了 SQL 的執行效率。
②可以減少開發工作量。將代碼封裝成模塊,實際上是編程的核心思想之一,這樣可以把復雜的問題拆解成不同的模塊,然后模塊之間可以重復使用,在減少開發工作量的同時,還能保證代碼的結構清晰。
③存儲過程的安全性強。我們在設定存儲過程的時候可以設置對用戶的使用權限,這樣就和視圖一樣具有較強的安全性。
④可以減少網絡傳輸量。因為代碼封裝到存儲過程中,每次使用只需要調用存儲過程即可,這樣就減少了網絡傳輸量。
⑤良好的封裝性。在進行相對復雜的數據庫操作時,原本需要使用一條一條的 SQL 語句,可能要連接多次數據庫才能完成的操作,現在變成了一次存儲過程,只需要連接一次即可。
⑥可移植性差。存儲過程不能跨數據庫移植,比如在 MySQL、Oracle 和 SQL Server 里編寫的存儲過程,在換成其他數據庫時都需要重新編寫。
⑦調試困難。只有少數 DBMS 支持存儲過程的調試。對于復雜的存儲過程來說,開發和維護都不容易。
⑧存儲過程的版本管理很困難。比如數據表索引發生變化了,可能會導致存儲過程失效。我們在開發軟件的時候往往需要進行版本管理,但是存儲過程本身沒有版本控制,版本迭代更新的時候很麻煩
總結
以上是生活随笔為你收集整理的江南大学物联网工程学院数据库课程实验二作业2实验报告的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 商品房预售合同联机备案表(联机备案表)
- 下一篇: java forkjoin MySQL_