工學(xué)網(wǎng)絡(luò)語言數(shù)據(jù)庫SQL-Server高級(jí)應(yīng)用課件_第1頁
工學(xué)網(wǎng)絡(luò)語言數(shù)據(jù)庫SQL-Server高級(jí)應(yīng)用課件_第2頁
工學(xué)網(wǎng)絡(luò)語言數(shù)據(jù)庫SQL-Server高級(jí)應(yīng)用課件_第3頁
工學(xué)網(wǎng)絡(luò)語言數(shù)據(jù)庫SQL-Server高級(jí)應(yīng)用課件_第4頁
工學(xué)網(wǎng)絡(luò)語言數(shù)據(jù)庫SQL-Server高級(jí)應(yīng)用課件_第5頁
已閱讀5頁,還剩101頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

數(shù)據(jù)共享數(shù)據(jù)獨(dú)立最小冗余

數(shù)據(jù)安全

數(shù)據(jù)完整

靈活性和可恢復(fù)性

數(shù)據(jù)庫技術(shù)及網(wǎng)絡(luò)應(yīng)用

數(shù)據(jù)共享數(shù)據(jù)庫技術(shù)及網(wǎng)絡(luò)應(yīng)用

章節(jié)目錄數(shù)據(jù)庫技術(shù)7.1游標(biāo)

7.2存儲(chǔ)過程

7.3觸發(fā)器

第7章SQLServer高級(jí)應(yīng)用

7.1.1游標(biāo)概述7.1.2聲明游標(biāo)7.1.3打開游標(biāo)

7.2.1存儲(chǔ)過程概述

7.2.2存儲(chǔ)過程的創(chuàng)建與執(zhí)行

7.2.3實(shí)例:不帶參數(shù)的存儲(chǔ)過程

7.1.4讀取游標(biāo)數(shù)據(jù)

7.1.5實(shí)例:定義一個(gè)滾動(dòng)游標(biāo)

7.2.4實(shí)例:帶輸入?yún)?shù)的存儲(chǔ)過程7.2.5實(shí)例:帶輸入和輸出參數(shù)的存儲(chǔ)過程7.4事務(wù)處理

小結(jié)

7.1.6實(shí)例:讀取游標(biāo)中的數(shù)據(jù)存入變量中

7.1.7利用游標(biāo)更新數(shù)據(jù)和刪除數(shù)據(jù)

7.1.8實(shí)例:利用游標(biāo)統(tǒng)計(jì)數(shù)據(jù)行數(shù)

7.1.9關(guān)閉游標(biāo)和釋放游標(biāo)7.1.10實(shí)例:利用游標(biāo)刪除表中的一行7.2.6存儲(chǔ)過程的修改、重命名和刪除

7.2.7實(shí)例:修改存儲(chǔ)過程

7.2.8實(shí)例:重命名和刪除存儲(chǔ)過程章節(jié)目錄數(shù)據(jù)庫技術(shù)7.1游標(biāo)7.2存儲(chǔ)過程7.32章節(jié)目錄數(shù)據(jù)庫技術(shù)7.1游標(biāo)

7.2存儲(chǔ)過程

7.3觸發(fā)器

第7章SQLServer高級(jí)應(yīng)用

7.3.1觸發(fā)器概述

7.3.2觸發(fā)器的工作原理

7.3.3觸發(fā)器的創(chuàng)建與執(zhí)行

7.4.1事務(wù)概述

7.4.2事務(wù)屬性

7.4.3事務(wù)控制語句

7.3.4實(shí)例:顯示功能觸發(fā)器7.3.5觸發(fā)器的修改、刪除和顯示

7.4.4實(shí)例:事務(wù)編程

7.4.5事務(wù)并發(fā)處理與并發(fā)控制

7.4事務(wù)處理

小結(jié)

7.3.7實(shí)例:更新功能觸發(fā)器7.3.6實(shí)例:插入功能觸發(fā)器章節(jié)目錄數(shù)據(jù)庫技術(shù)7.1游標(biāo)7.2存儲(chǔ)過程7.33本章提要數(shù)據(jù)庫技術(shù)本章通過大量實(shí)例介紹SQL語句的高級(jí)應(yīng)用,包括游標(biāo)、存儲(chǔ)過程、觸發(fā)器、事務(wù)處理的功能及基本操作。它們是網(wǎng)絡(luò)數(shù)據(jù)庫編程的重要內(nèi)容,是開發(fā)網(wǎng)絡(luò)數(shù)據(jù)庫應(yīng)用程序的關(guān)鍵技術(shù)。第7章SQLServer高級(jí)應(yīng)用7.1游標(biāo)

7.2存儲(chǔ)過程

7.3觸發(fā)器

7.4事務(wù)處理

小結(jié)

本章提要數(shù)據(jù)庫技術(shù)本章通過大量實(shí)例介紹SQL語4數(shù)據(jù)庫技術(shù)7.1游標(biāo)7.1.1游標(biāo)概述游標(biāo)是類似于C語言指針一樣的結(jié)構(gòu),面對包括多條數(shù)據(jù)記錄的結(jié)果集,游標(biāo)能完成每次只提取一條記錄的操作。游標(biāo)由兩部分組成:結(jié)果集和在結(jié)果集中指向某一記錄位置的指針。游標(biāo)提供了一種在服務(wù)器內(nèi)部處理結(jié)果集的方法,它可以識(shí)別一個(gè)數(shù)據(jù)集合內(nèi)部指定的工作行,從而可以有選擇地按行采取操作。第七章SQLServer高級(jí)應(yīng)用數(shù)據(jù)庫技術(shù)7.1游標(biāo)7.1.1游標(biāo)概述5數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用7.1.2聲明游標(biāo)在使用游標(biāo)之前首先要聲明游標(biāo)。用T-SQL聲明游標(biāo)的語法如下:declare游標(biāo)名[insensitive][scroll]cursorforselect語句[forreadonly|update[of列名1,列名2.……]]語法注釋:游標(biāo)名為聲明的游標(biāo)取的名字,游標(biāo)名必須符合標(biāo)識(shí)符的命名規(guī)則。[insensitive]使用insensitive定義的游標(biāo),會(huì)將提取出來的數(shù)據(jù)存放在系統(tǒng)數(shù)據(jù)庫tempdb創(chuàng)建的一個(gè)臨時(shí)表里。任何通過該游標(biāo)進(jìn)行的操作都在臨時(shí)表里進(jìn)行,因此所有對基本表的改動(dòng)都不會(huì)在游標(biāo)中體現(xiàn)出來。[scroll]使用scroll定義的游標(biāo),稱為滾動(dòng)游標(biāo),可以提取任意位置的數(shù)據(jù)行。若無此關(guān)鍵字,只能按順序提取。select語句指標(biāo)準(zhǔn)的select語句,用來定義游標(biāo)所要處理的結(jié)果集。readonly聲明只讀游標(biāo),不允許通過游標(biāo)進(jìn)行數(shù)據(jù)更新。update[of列名1,列名2.……]聲明可更新的游標(biāo)中允許更新的列。若只選update,則所有的列都可更新。

數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用7.1.26數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用在使用游標(biāo)之前,必須先打開游標(biāo)。利用T-SQL打開游標(biāo)的語法格式:open游標(biāo)名功能注釋:當(dāng)執(zhí)行打開游標(biāo)的語句時(shí),服務(wù)器執(zhí)行聲明游標(biāo)時(shí)使用的select語句。此時(shí),用游標(biāo)提取數(shù)據(jù)的當(dāng)前位置是數(shù)據(jù)集的第一條記錄。7.1.3打開游標(biāo)數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用在使用游標(biāo)之7數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用語法注釋:(1)使用scroll關(guān)鍵字聲明的游標(biāo),具有以下所有的取數(shù)功能:

first取第一行數(shù)據(jù)

prior取前一行數(shù)據(jù)

next取下一行數(shù)據(jù)

last取最后一行數(shù)據(jù)

absolute<n>按絕對位置取數(shù)據(jù),從游標(biāo)中取出第n行記錄

relative<n>按相對位置取數(shù)據(jù),讀出從游標(biāo)當(dāng)前位置向后第行記錄。(2)[into變量名表]使用into子句對變量賦值時(shí),變量的數(shù)量、類型、順序必須和聲明游標(biāo)時(shí)使用的select語句輸出的列項(xiàng)一一對應(yīng)。7.1.4讀取游標(biāo)數(shù)據(jù)打開游標(biāo)之后,就可以用游標(biāo)讀取數(shù)據(jù)了。利用T-SQL讀取游標(biāo)的語法如下:fetch[first|prior|next|last]|[absolutetn|relativen]from游標(biāo)名[into變量名表]數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用語法注釋:78數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用程序構(gòu)思:本例聲明一個(gè)游標(biāo),用來逐條顯示“學(xué)生表”中性別為“女”的記錄。操作步驟:(1)單擊【開始】→【所有程序】→【MicrosoftSQLServer2005】→【SQLServerManagementStudio】,打開【連接到服務(wù)器】對話框,單擊【連接】鈕,彈出【MicrosoftSQLServerManagementStudio】管理器窗口。(2)單擊常用工具欄中的鈕,則建立了一個(gè)數(shù)據(jù)庫引擎查詢文檔,文檔名默認(rèn)為

SQLQuery1.sql。7.1.5實(shí)例:定義一個(gè)滾動(dòng)游標(biāo)數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用程序構(gòu)思:79數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用(3)在SQLQuery1.sql文檔界面輸入代碼:use學(xué)生成績管理declarecursor1scrollcursorforselect*from學(xué)生表where性別='女'opencursor1fetchfirstfromcursor1while@@fetch_status=0beginfetchnextfromcursor1end(4)單擊工具欄上的按鈕,或按F5鍵@@fetch_status是一個(gè)全局變量,若其值為0,則表示fetch命令被成功執(zhí)行。數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用(3)在SQ10數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用7.1.6實(shí)例:讀取游標(biāo)中的數(shù)據(jù)存入變量中程序構(gòu)思:本例聲明的游標(biāo),其結(jié)果集為選修“三維動(dòng)畫設(shè)計(jì)”課程成績最高的學(xué)生的學(xué)號(hào)、姓名、課程名稱和成績,并將從游標(biāo)中讀取的數(shù)據(jù)存放到局部變量中,再輸出變量中的值。操作步驟:(1)單擊【開始】→【所有程序】→【MicrosoftSQLServer2005】→【SQLServerManagementStudio】,打開【連接到服務(wù)器】對話框,單擊【連接】鈕,彈出【MicrosoftSQLServerManagementStudio】管理器窗口。(2)單擊常用工具欄中的鈕,則建立了一個(gè)數(shù)據(jù)庫引擎查詢文檔,文檔名默認(rèn)為SQLQuery1.sql。數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用7.1.611數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用(3)在SQLQuery1.sql文檔界面輸入代碼:use學(xué)生成績管理declarecursor2scrollcursorforselecta.學(xué)號(hào),姓名,課程名稱,成績from學(xué)生表a,課程表b,成績表cwhere課程名稱='三維動(dòng)畫設(shè)計(jì)'andc.學(xué)號(hào)=a.學(xué)號(hào)andb.課程編號(hào)=c.課程編號(hào)

orderby成績desc

opencursor2declare@numchar(20)declare@namechar(20)declare@score_namechar(20)declare@maxintfetchfirstfromcursor2into@num,@name,@score_name,@maxselect@numas編號(hào),@nameas名字,@score_nameas課名,@maxas分?jǐn)?shù)(4)單擊工具欄上的按鈕,或按F5鍵。數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用(3)在SQ12數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用語法注釋:currentof游標(biāo)名表示當(dāng)前游標(biāo)的當(dāng)前數(shù)據(jù)行,該子句只能在update和delete操作的語句中使用。7.1.7利用游標(biāo)更新數(shù)據(jù)和刪除數(shù)據(jù)要通過游標(biāo)對數(shù)據(jù)進(jìn)行修改,該游標(biāo)必須被聲明為可更新的游標(biāo)。在聲明游標(biāo)時(shí),只要不使用forreadonly關(guān)鍵字,游標(biāo)都是可更新的。利用T-SQL更新游標(biāo)的語法格式:update表名set列名=表達(dá)式[,……]wherecurrentof游標(biāo)名利用T-SQL刪除游標(biāo)的語法格式:

deletefrom表名set列名=表達(dá)式[,……]wherecurrentof游標(biāo)名數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用語法注釋:713數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用程序構(gòu)思:本例聲明的游標(biāo),其執(zhí)行結(jié)果集為沒有被選修的課程信息,包括課程編號(hào)、課程名、學(xué)分。統(tǒng)計(jì)結(jié)果集中的數(shù)據(jù)行數(shù),并顯示相應(yīng)的提示信息。7.1.8實(shí)例:利用游標(biāo)統(tǒng)計(jì)數(shù)據(jù)行數(shù)操作步驟:(1)單擊【開始】→【所有程序】→【MicrosoftSQLServer2005】→【SQLServerManagementStudio】,打開【連接到服務(wù)器】對話框,單擊【連接】鈕,彈出【MicrosoftSQLServerManagementStudio】管理器窗口。(2)單擊常用工具欄中的鈕,則建立了一個(gè)數(shù)據(jù)庫引擎查詢文檔,文檔名默認(rèn)為SQLQuery1.sql。數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用程序構(gòu)思:714數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用(3)在SQLQuery1.sql文檔界面輸入代碼:

use學(xué)生成績管理

declarecursor3scrollcursorfor

selectdistincta.課程編號(hào),課程名稱,學(xué)分from課程表a,成績表b

wherea.課程編號(hào)notin(selectdistinct課程編號(hào)from成績表)

opencursor3fetchfirstfromcursor3while@@fetch_status=0beginfetchnextfromcursor3endselect@@cursor_rowsas'未被選修的課程數(shù)'打開游標(biāo)后,可以使用全局變量@@cursor_rows返回當(dāng)前游標(biāo)可以操作的數(shù)據(jù)行數(shù)。(4)單擊工具欄上的按鈕,或按F5鍵

數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用(3)在SQ15數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用2.釋放游標(biāo)游標(biāo)結(jié)構(gòu)本身也會(huì)占用一定的計(jì)算機(jī)資源,所以在使用完游標(biāo)后,為了回收被占用的資源,應(yīng)該將游標(biāo)釋放。利用T-SQL釋放游標(biāo)的語法格式:deallocate游標(biāo)名當(dāng)釋放完游標(biāo)以后,如果要重新使用這個(gè)游標(biāo),則必須重新執(zhí)行聲明游標(biāo)的語句。7.1.9關(guān)閉游標(biāo)和釋放游標(biāo)

1.關(guān)閉游標(biāo)在打開游標(biāo)之后,SQLServer服務(wù)器會(huì)專門為游標(biāo)開辟一定的內(nèi)存空間存放游標(biāo)操作的數(shù)據(jù)結(jié)果集,同時(shí)游標(biāo)的使用也會(huì)根據(jù)具體情況對某些數(shù)據(jù)進(jìn)行封鎖。所以,在不使用游標(biāo)的時(shí)候,一定要關(guān)閉游標(biāo),以通知服務(wù)器釋放游標(biāo)所占用的資源。利用T-SQL關(guān)閉游標(biāo)的語法格式:close游標(biāo)名關(guān)閉游標(biāo)之后,可以再次打開游標(biāo),在一個(gè)批處理中,可以多次打開和關(guān)閉游標(biāo)。數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用2.釋放游標(biāo)16數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用程序構(gòu)思:本例聲明的游標(biāo),其執(zhí)行結(jié)果集為成績最低的學(xué)生信息,包括學(xué)號(hào)、姓名、所屬院系、成績,通過游標(biāo)在成績表中將成績最低的一條記錄刪除。操作步驟:(1)單擊【開始】→【所有程序】→【MicrosoftSQLServer2005】→【SQLServerManagementStudio】,打開【連接到服務(wù)器】對話框,單擊

【連接】鈕,彈出【MicrosoftSQLServerManagementStudio】管理器窗口。(2)單擊常用工具欄中的鈕,則建立了一個(gè)數(shù)據(jù)庫引擎查詢文檔,文檔名默認(rèn)為

SQLQuery1.sql。7.1.10實(shí)例:利用游標(biāo)刪除表中的一行數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用程序構(gòu)思:717數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用(3)在SQLQuery1.sql文檔界面輸入代碼:

use學(xué)生成績管理

declarecursor4scrollcursorfor

selecta.學(xué)號(hào),姓名,所屬院系,成績

from學(xué)生表a,成績表b

wherea.學(xué)號(hào)=b.學(xué)號(hào)and成績=(selectmin(成績)from成績表)opencursor4fetchfirstfromcursor4deletefrom成績表wherecurrentofcursor4closecursor4deallocatecursor4(4)單擊工具欄上的按鈕,或按F5鍵。數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用(3)在SQ18數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用7.2存儲(chǔ)過程7.2.1存儲(chǔ)過程概述存儲(chǔ)過程具有以下優(yōu)點(diǎn):(1)由一系列T-SQL語句組成,可作為一個(gè)整體被程序多次調(diào)用;(2)修改容易,可移植性好;(3)存儲(chǔ)過程是預(yù)編譯的,執(zhí)行速度快;(4)在網(wǎng)絡(luò)中調(diào)用過程,只需要傳送調(diào)用過程的語句,因此可減少網(wǎng)絡(luò)流量;(5)可通過對執(zhí)行存儲(chǔ)過程的權(quán)限控制來保證系統(tǒng)數(shù)據(jù)的安全;(6)存儲(chǔ)過程可嵌套調(diào)用,即在一個(gè)存儲(chǔ)過程中調(diào)用另一個(gè)存儲(chǔ)過程。數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用7.2存19數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用7.2.2存儲(chǔ)過程的創(chuàng)建與執(zhí)行1.創(chuàng)建存儲(chǔ)過程利用T-SQL創(chuàng)建存儲(chǔ)過程的語法格式:createproc過程名@parameter參數(shù)類型/*輸入?yún)?shù)*/……@parameter參數(shù)類型ouput/*輸出參數(shù)*/……asbegin命令行或命令塊end2.執(zhí)行存儲(chǔ)過程利用T-SQL執(zhí)行存儲(chǔ)過程的語法格式:execute過程名[參數(shù)1,參數(shù)2,……][output]數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用7.2.220數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用程序構(gòu)思:本例存儲(chǔ)過程的功能是顯示所有選修了“數(shù)據(jù)庫技術(shù)及網(wǎng)絡(luò)應(yīng)用”課程的學(xué)生的學(xué)號(hào)、姓名、所屬院系和成績。操作步驟:(1)單擊【開始】→【所有程序】→【MicrosoftSQLServer2005】→【SQLServerManagementStudio】,打開【連接到服務(wù)器】對話框,單擊

【連接】鈕,彈出【MicrosoftSQLServerMana-gementStudio】管理器窗口。(2)單擊常用工具欄中的鈕,則建立了一個(gè)數(shù)據(jù)庫引擎查詢文檔,文檔名默認(rèn)為

SQLQuery1.sql。7.2.3實(shí)例:不帶參數(shù)的存儲(chǔ)過程數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用程序構(gòu)思:721數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用(3)在SQLQuery1.sql文檔界面輸入代碼:

use學(xué)生成績管理gocreateprocproc1asbegin

selecta.學(xué)號(hào),姓名,所屬院系,成績from學(xué)生表a,課程表b,成績表cwhere課程名稱='數(shù)據(jù)庫技術(shù)及網(wǎng)絡(luò)應(yīng)用'andb.課程編號(hào)=c.課程編號(hào)andc.學(xué)號(hào)=a.學(xué)號(hào)endgoexecuteproc1/*執(zhí)行存儲(chǔ)過程*/(4)單擊工具欄上的按鈕,或按F5鍵。數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用(3)在SQ22數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用程序構(gòu)思:本例存儲(chǔ)過程的功能是查詢擔(dān)任某門課程的教師的基本信息。執(zhí)行存儲(chǔ)過程時(shí),允許帶輸入?yún)?shù),即課程名稱。存儲(chǔ)過程的執(zhí)行結(jié)果顯示教師的姓名、職稱和聯(lián)系電話。7.2.4實(shí)例:帶輸入?yún)?shù)的存儲(chǔ)過程操作步驟:(1)單擊【開始】→【所有程序】→【MicrosoftSQLServer2005】→【SQLServerManagementStudio】,打開【連接到服務(wù)器】對話框,單擊【連接】鈕,彈出【MicrosoftSQLServerManagementStudio】管理器窗口。(2)單擊常用工具欄中的鈕,則建立了一個(gè)數(shù)據(jù)庫引擎查詢文檔,文檔名默認(rèn)為SQLQuery1.sql。

數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用程序構(gòu)思:723數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用(3)在SQLQuery1.sql文檔界面輸入代碼:

use學(xué)生成績管理

go

createprocproc2

@scrose_namevarchar(20)as

begin

select姓名,職稱,聯(lián)系電話from課程表a,教師表b

where課程名稱=@scrose_nameanda.教師編號(hào)=b.教師編號(hào)

endgoexecuteproc2'C語言程序設(shè)計(jì)'/*執(zhí)行存儲(chǔ)過程*/(4)單擊工具欄上的按鈕,或按F5鍵。數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用(3)在SQ24數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用7.2.5實(shí)例:帶輸入和輸出參數(shù)的存儲(chǔ)過程程序構(gòu)思:本存儲(chǔ)過程的功能是統(tǒng)計(jì)某院系學(xué)生的最大年齡和平均年齡。執(zhí)行存儲(chǔ)過程時(shí),允許帶輸入?yún)?shù)和輸出參數(shù)。輸入?yún)?shù)為所屬院系名稱,輸出參數(shù)保存所執(zhí)行的結(jié)果,即最大年齡和平均年齡。操作步驟:(1)單擊【開始】→【所有程序】→【MicrosoftSQLServer2005】→【SQLServerManagementStudio】,打開【連接到服務(wù)器】對話框,單擊【連接】鈕,彈出【MicrosoftSQLServerManagementStudio】管理器窗口。(2)單擊常用工具欄中的鈕,則建立了一個(gè)數(shù)據(jù)庫引擎查詢文檔,文檔名默認(rèn)為SQLQuery1.sql。數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用7.2.525數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用(3)在SQLQuery1.sql文檔界面輸入代碼:

use學(xué)生成績管理

go

createprocproc3

@yuanxichar(20),@maxageintoutput,@averagerealoutputasbegin

select@maxage=max(datepart(yy,getdate())-datepart(yy,出生日期))from學(xué)生表where所屬院系=@yuanxiselect@average=avg(datepart(yy,getdate())-datepart(yy,出生日期))from學(xué)生表where所屬院系=@yuanxiendgodeclare@x1int,@x2realexecuteproc3'教育學(xué)院',@x1output,@x2outputselect@x1最大年齡,@x2平均年齡(4)單擊工具欄上的按鈕,或按F5鍵。數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用(3)在SQ26數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用7.2.6存儲(chǔ)過程的修改、重命名和刪除1.修改存儲(chǔ)過程利用T-SQL修改存儲(chǔ)過程的語法格式:alterproc過程名@parameter參數(shù)類型/*輸入?yún)?shù)*/……@parameter參數(shù)類型ouput/*輸出參數(shù)*/……asbegin命令行或命令塊end修改存儲(chǔ)過程是指修改存儲(chǔ)過程的內(nèi)容。如果要修改某一存儲(chǔ)過程,在創(chuàng)建該存儲(chǔ)過程的代碼中,將命令動(dòng)詞creat改為alter,再修改其內(nèi)容即可。數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用7.2.627數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用2.存儲(chǔ)過程的重命名1.修改存儲(chǔ)過程利用T-SQL修改存儲(chǔ)過程的語法格式:alterproc過程名@parameter參數(shù)類型/*輸入?yún)?shù)*/……@parameter參數(shù)類型ouput/*輸出參數(shù)*/……asbegin命令行或命令塊end修改存儲(chǔ)過程是指修改存儲(chǔ)過程的內(nèi)容。如果要修改某一存儲(chǔ)過程,在創(chuàng)建該存儲(chǔ)過程的代碼中,將命令動(dòng)詞creat改為alter,再修改其內(nèi)容即可。數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用2.存儲(chǔ)過28數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用3.刪除存儲(chǔ)過程利用T-SQL語句刪除存儲(chǔ)過程的語法格式:dropproc存儲(chǔ)過程名1[,存儲(chǔ)過程名2,……]刪除存儲(chǔ)過程是指將存儲(chǔ)過程作為數(shù)據(jù)庫對象從數(shù)據(jù)庫中徹底刪除。一次可刪除多個(gè)存儲(chǔ)過程。利用T-SQL語句給存儲(chǔ)過程重命名的語法格式:sp_rename原過程名,新過程名給存儲(chǔ)過程重命名只是修改存儲(chǔ)過程的名字,和存儲(chǔ)過程內(nèi)容本身無關(guān)。該功能用系統(tǒng)存儲(chǔ)過程sp_rename實(shí)現(xiàn),該系統(tǒng)存儲(chǔ)過程存放在master數(shù)據(jù)庫里,在任何數(shù)據(jù)庫中都可直接調(diào)用它。數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用3.刪除存儲(chǔ)29數(shù)據(jù)庫技術(shù)7.2.7實(shí)例:修改存儲(chǔ)過程第七章SQLServer高級(jí)應(yīng)用程序構(gòu)思:本例是將存儲(chǔ)過程pro3的功能修改為輸入院系名稱,輸出該院系學(xué)生的人數(shù)。操作步驟:(1)單擊【開始】→【所有程序】→【MicrosoftSQLServer2005】→【SQLServerManagementStudio】,打開【連接到服務(wù)器】對話框,單擊

【連接】鈕,彈出【MicrosoftSQLServerManagementStudio】管理器窗口。(2)單擊常用工具欄中的鈕,則建立了一個(gè)數(shù)據(jù)庫引擎查詢文檔,文檔名默認(rèn)為

SQLQuery1.sql。數(shù)據(jù)庫技術(shù)7.2.7實(shí)例:修改存儲(chǔ)過程第七章SQL30數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用(3)在SQLQuery1.sql文檔界面輸入代碼:

use學(xué)生成績管理goalterprocproc3@yuanxichar(20),@countintoutputasbeginselect@count=count(*)from學(xué)生表where所屬院系=@yuanxiendgodeclare@xintexecuteproc3'物電學(xué)院',@xoutputselect@x人數(shù)(4)單擊工具欄上的按鈕,或按F5鍵。此例中,若想輸出院系名稱和人數(shù),即將輸入?yún)?shù)也作為結(jié)果輸出,應(yīng)怎樣改進(jìn)?數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用(3)在SQ31數(shù)據(jù)庫技術(shù)7.2.8實(shí)例:重命名和刪除存儲(chǔ)過程程序構(gòu)思:本例是將將存儲(chǔ)過程proc1刪除,再將存儲(chǔ)過程名pro3改為pro3new。操作步驟:(1)單擊【開始】→【所有程序】→【MicrosoftSQLServer2005】→【SQLServerManagementStudio】,打開【連接到服務(wù)器】對話框,單擊

【連接】鈕,彈出【MicrosoftSQLServerManagementStudio】管理器窗口。(2)單擊常用工具欄中的鈕,則建立了一個(gè)數(shù)據(jù)庫引擎查詢文檔,文檔名默認(rèn)為

SQLQuery1.sql。第七章SQLServer高級(jí)應(yīng)用(3)在SQLQuery1.sql文檔界面輸入代碼:dropprocproc1sp_renameproc3,proc3newnew(4)單擊工具欄上的按鈕,或按F5鍵。數(shù)據(jù)庫技術(shù)7.2.8實(shí)例:重命名和刪除存儲(chǔ)過程程序構(gòu)思:32數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用7.3.1觸發(fā)器概述1.觸發(fā)器的概念觸發(fā)器是一種特殊的存儲(chǔ)過程,它和表密切相連,可以看作是表格定義的一部分。當(dāng)用戶對指定表操作時(shí),觸發(fā)器會(huì)自動(dòng)執(zhí)行。觸發(fā)器在update、insert、delete等操作執(zhí)行結(jié)束后才執(zhí)行。2.觸發(fā)器的功能(1)級(jí)聯(lián)更新數(shù)據(jù)庫中相關(guān)表的數(shù)據(jù);(2)實(shí)現(xiàn)多表之間數(shù)據(jù)的一致性;(3)執(zhí)行比檢查約束更復(fù)雜的約束操作;(4)調(diào)用存儲(chǔ)過程;(5)在一張表的update、insert、delete操作上可設(shè)置多個(gè)觸發(fā)器。

7.3觸發(fā)器數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用7.3.133數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用3.使用觸發(fā)器應(yīng)注意的問題(1)當(dāng)使用約束、規(guī)則、默認(rèn)值等方法能夠?qū)崿F(xiàn)數(shù)據(jù)的完整性,就不用觸發(fā)器實(shí)現(xiàn);(2)只有表的擁有者才可以在表上創(chuàng)建或刪除觸發(fā)器,這種權(quán)限不準(zhǔn)轉(zhuǎn)授;(3)使用update語句可以一次對多行數(shù)據(jù)進(jìn)行修改,而觸發(fā)器只被觸發(fā)一次;(4)觸發(fā)器只能在當(dāng)前數(shù)據(jù)庫中創(chuàng)建,觸發(fā)器的命名必須要遵守標(biāo)識(shí)符的命名規(guī)則。4.觸發(fā)器的優(yōu)點(diǎn)(1)觸發(fā)器是自動(dòng)的;(2)觸發(fā)器可以通過數(shù)據(jù)庫中的相關(guān)表進(jìn)行層疊更改;(3)觸發(fā)器可以強(qiáng)制限制,這些限制比用check所定義的約束更復(fù)雜。數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用3.使用觸發(fā)34數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用7.3.2觸發(fā)器的工作原理inserted表和deleted表的特點(diǎn)如下:

(1)這兩張表是邏輯表,由數(shù)據(jù)庫管理,用戶不能對他們進(jìn)行修改;(2)這兩張表存儲(chǔ)在內(nèi)存中,而不是存儲(chǔ)在數(shù)據(jù)庫中;(3)這兩張表的結(jié)構(gòu)與被該觸發(fā)器作用的表結(jié)構(gòu)相同;(4)當(dāng)觸發(fā)器完成操作后,這兩張表會(huì)自動(dòng)刪除;(5)兩張表中保存的數(shù)據(jù)是因用戶操作而被影響到的原數(shù)據(jù)或新數(shù)據(jù);(6)這兩張表是只讀表。數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用7.3.235數(shù)據(jù)庫技術(shù)利用T-SQL創(chuàng)建觸發(fā)器的語法格式:creattrigger觸發(fā)器名稱on表名forupdate[,insert,delete]asbeginsql語句endreturn語法注釋:觸發(fā)器名稱是用戶給要?jiǎng)?chuàng)建的觸發(fā)器起的名字on表名觸發(fā)器作用的表名稱forupdate[,insert,delete]指明激活觸發(fā)器的操作sql語句指明觸發(fā)器要執(zhí)行的操作return表示返回調(diào)用位置觸發(fā)器的執(zhí)行是指對表進(jìn)行的update、insert、delete操作。第七章SQLServer高級(jí)應(yīng)用7.3.3觸發(fā)器的創(chuàng)建與執(zhí)行數(shù)據(jù)庫技術(shù)利用T-SQL創(chuàng)建觸發(fā)器的語法格式:第七章SQ36數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用7.3.4實(shí)例:顯示功能觸發(fā)器程序構(gòu)思:本例創(chuàng)建的觸發(fā)器具有顯示信息功能。為成績表創(chuàng)建一個(gè)觸發(fā)器,在刪除成績表中的記錄時(shí),顯示表中有多少條記錄被刪除。操作步驟:(1)單擊【開始】→【所有程序】→【MicrosoftSQLServer2005】→【SQLServerMan-agementStudio】,打開【連接到服務(wù)器】對話框,單擊【連接】鈕,彈出【MicrosoftSQLServerManagementStudio】管理器窗口。(2)單擊常用工具欄中的鈕,則建立了一個(gè)數(shù)據(jù)庫引擎查詢文檔,文檔名默認(rèn)為

SQLQuery1.sql。數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用7.3.437數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用(3)在SQLQuery1.sql文檔界面輸入代碼:

use學(xué)生成績管理gocreatetriggertrigger1on成績表fordeleteasbegindeclare@countvarchar(30)select@count=str(@@rowcount)+‘個(gè)記錄被刪除!'

print@countendgodeletefrom成績表where成績=0(4)單擊工具欄上的按鈕,或按F5鍵。@@rowcount是全局變量,該變量存儲(chǔ)的是執(zhí)行一條T-SQL語句后所影響的行數(shù)。數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用(3)在SQ38數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用1.修改觸發(fā)器利用T-SQL修改觸發(fā)器的語法格式:altertrigger觸發(fā)器名稱on表名forupdate[,insert,delete]asbeginsql語句endreturn語法注釋:修改觸發(fā)器只需在創(chuàng)建觸發(fā)器的語法格式里,將create改為alter。7.3.5觸發(fā)器的修改、刪除和顯示數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用1.修改觸發(fā)39數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用2.刪除觸發(fā)器利用T-SQL刪除觸發(fā)器的語法格式:droptrigger觸發(fā)器名[,...n]語法注釋:觸發(fā)器名要?jiǎng)h除的觸發(fā)器名稱[,...n]表示可以刪除多個(gè)觸發(fā)器

3.顯示觸發(fā)器信息用SQLServer提供的系統(tǒng)存儲(chǔ)過程顯示所創(chuàng)建的觸發(fā)器的有關(guān)信息。格式及功能如下:sp_help觸發(fā)器名顯示觸發(fā)器的一般信息sp_helptext觸發(fā)器名顯示觸發(fā)器的文本信息sp_depends表名顯示表中各種依賴關(guān)系sp_depends觸發(fā)器名顯示觸發(fā)器所引用的對象。數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用2.刪除觸40數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用程序構(gòu)思:本例為學(xué)生表創(chuàng)建一個(gè)觸發(fā)器,實(shí)現(xiàn)級(jí)聯(lián)插入。當(dāng)向?qū)W生表中插入一條新記錄時(shí),系統(tǒng)會(huì)將該生的學(xué)號(hào)自動(dòng)插入到成績表中,并在成績表中填寫選修的課程編號(hào)是“EIT27401C”。7.3.6實(shí)例:插入功能觸發(fā)器操作步驟:(1)單擊【開始】→【所有程序】→【MicrosoftSQLServer2005】→【SQLServerManagementStudio】,打開【連接到服務(wù)器】對話框,單擊【連接】鈕,彈出【MicrosoftSQLServerManagementStudio】管理器窗口。(2)單擊常用工具欄中的鈕,則建立了一個(gè)數(shù)據(jù)庫引擎查詢文檔,文檔名默認(rèn)為SQLQuery1.sql。數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用程序構(gòu)思:741數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用(3)在SQLQuery1.sql文檔界面輸入代碼:

use學(xué)生成績管理gocreatetriggertrigger2on學(xué)生表forinsertasbegindeclare@numbervarchar(10)select@number=學(xué)號(hào)frominsertedinsertinto成績表(學(xué)號(hào),課程編號(hào))values(@number,'EIT27401C')endgoinsertinto學(xué)生表(學(xué)號(hào),姓名,性別)values('06506999','齊飛','男')(4)單擊工具欄上的按鈕,或按F5鍵。數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用(3)在SQ42數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用程序構(gòu)思:本例為成績表創(chuàng)建一個(gè)更新觸發(fā)器,其作用是只要執(zhí)行更新操作,所有記錄的成績都加5分。7.3.7實(shí)例:更新功能觸發(fā)器操作步驟:(1)單擊【開始】→【所有程序】→【MicrosoftSQLServer2005】→【SQLServerManagementStudio】,打開【連接到服務(wù)器】對話框,單擊【連接】鈕,彈出【MicrosoftSQLServerManagementStudio】管理器窗口。(2)單擊常用工具欄中的鈕,則建立了一個(gè)數(shù)據(jù)庫引擎查詢文檔,文檔名默認(rèn)為SQLQuery1.sql。數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用程序構(gòu)思:743數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用(3)在SQLQuery1.sql文檔界面輸入代碼:

droptriggertrigger3gocreatetriggertrigger3on成績表forupdateasupdate成績表set成績=成績+5

select*frominsertedselect*fromdeletedreturngoupdate成績表set成績=100where學(xué)號(hào)='06501011'and課程編號(hào)='FCA10200C'(4)單擊工具欄上的按鈕,或按F5鍵。數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用(3)在SQ44數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用1.事務(wù)的概念在數(shù)據(jù)庫系統(tǒng)中,把一系列具有“要么什么也不做,要么都做完”特征的數(shù)據(jù)庫操作定義為一個(gè)事務(wù)。事務(wù)反映了現(xiàn)實(shí)世界中需要以一個(gè)完整的單位提交的一項(xiàng)工作。事務(wù)是一個(gè)邏輯工作單元,它必須完整地執(zhí)行,或者全都不執(zhí)行。

7.4事務(wù)處理7.4.1事務(wù)概述2.數(shù)據(jù)庫一致性狀態(tài)數(shù)據(jù)庫的一致性狀態(tài)是指所有數(shù)據(jù)都滿足數(shù)據(jù)完整性約束條件的狀態(tài)。3.事務(wù)處理事務(wù)處理是保證數(shù)據(jù)庫一致性狀態(tài)的重要方法。4.實(shí)現(xiàn)數(shù)據(jù)庫一致性狀態(tài)的方法為了保證數(shù)據(jù)庫的一致性狀態(tài),SQLServer必須控制和保證事務(wù)的執(zhí)行能夠符合數(shù)據(jù)庫的完整性約束條件。數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用1.事務(wù)的概45數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用所有的事務(wù)都具有原子性、永久性、串行性和隔離性。

7.4.2事務(wù)屬性1.原子性2.永久性3.串行性4.隔離性數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用所有的事務(wù)都46數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用SQLServer通過事務(wù)控制語句,把SQLServer語句集合分組后,形成獨(dú)立的邏輯工作單元。事務(wù)處理控制語句有三個(gè):begintransaction表示事務(wù)開始committransaction表示事務(wù)提交rollbacktransaction表示事務(wù)回滾7.4.3事務(wù)控制語句幾點(diǎn)說明:(1)在SQLServer中,通常一個(gè)事務(wù)是以begintransaction開始,到一個(gè)相匹配的committransaction或rollbacktransaction之間的所有語句序列;(3)committransaction表示提交事務(wù)的一切操作,使得操作對數(shù)據(jù)的改變生效;(2)rollbacktransaction表示要撤消該事務(wù)已做的一切操作,回滾到事務(wù)開始的狀態(tài)。數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用SQLSe47數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用程序構(gòu)思:本例向成績表中插入一條記錄,若插入成功,則提交;否則,回滾。7.4.4實(shí)例:事務(wù)編程操作步驟:(1)單擊【開始】→【所有程序】→【MicrosoftSQLServer2005】→【SQLServerManagementStudio】,打開【連接到服務(wù)器】對話框,單擊【連接】鈕,彈出【MicrosoftSQLServerManagementStudio】管理器窗口。(2)單擊常用工具欄中的鈕,則建立了一個(gè)數(shù)據(jù)庫引擎查詢文檔,文檔名默認(rèn)為SQLQuery1.sql。數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用程序構(gòu)思:748數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用(3)在SQLQuery1.sql文檔界面輸入代碼:

begintransactioninsert成績表values('06501011','EIT37401',91)if@@error=0committransaction/*若無誤,則提交此事務(wù)*/

else

rollbacktransaction/*若有誤,則回退此事務(wù)*/(4)單擊工具欄上的按鈕,或按F5鍵。數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用(3)在SQ49數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用1.并發(fā)處理指CPU利用分時(shí)方法實(shí)現(xiàn)多個(gè)事務(wù)的交替進(jìn)行。7.4.5事務(wù)并發(fā)處理與并發(fā)控制

2.并發(fā)處理可能產(chǎn)生的問題(1)丟失更新(2)讀未提交數(shù)據(jù)(3)不一致檢索產(chǎn)生上述問題的原因:違背了事務(wù)的隔離性。數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用1.并發(fā)處理50數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用3.封鎖機(jī)制封鎖機(jī)制是實(shí)現(xiàn)并發(fā)控制的重要技術(shù),并發(fā)控制的作用是為了實(shí)現(xiàn)事務(wù)的隔離性。(1)封鎖的類型共享鎖:也稱讀鎖。如果事務(wù)T給數(shù)據(jù)對象X加上共享鎖,則其他事務(wù)只能對X再加共享鎖,不能加排它鎖。T及其他事務(wù)都可以且只能讀數(shù)據(jù)。排它鎖:也稱寫鎖。如果事務(wù)T對數(shù)據(jù)對象X加上排它鎖,則只允許事務(wù)T獨(dú)占數(shù)據(jù)項(xiàng)X,即對數(shù)據(jù)項(xiàng)X可讀、可寫。其他任何事務(wù)都不能對X加任何類型的鎖,直到T釋放X上的鎖。數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用3.封鎖機(jī)51數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用(2)封鎖規(guī)則1)數(shù)據(jù)項(xiàng)X未加鎖,誰都可以給它加鎖。2)數(shù)據(jù)項(xiàng)X已加共享鎖,其他事務(wù)只能加共享鎖。3)數(shù)據(jù)項(xiàng)X已加排他鎖,其他事務(wù)不能加任何鎖。4)誰加的鎖,誰釋放該鎖。(3)封鎖的粒度指封鎖對象的大小。封鎖的對象可以是數(shù)據(jù)庫、表、行、列等邏輯單元。(4)死鎖死鎖是若干事務(wù)相互等待對方釋放封鎖,死鎖是由于封鎖而產(chǎn)生的。(5)解決死鎖的方法死鎖的預(yù)防:要求每個(gè)事務(wù)必須一次性封鎖所要使用的全部數(shù)據(jù);規(guī)定封鎖的順序。

死鎖的診斷:DBMS周期性測試DBS系統(tǒng)是否處于死鎖狀態(tài)。

死鎖的解除:將一個(gè)處理代價(jià)小的事務(wù)撤銷,回滾該事務(wù),并釋放該事務(wù)持有的鎖。數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用(2)封鎖規(guī)52數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用本章所講的內(nèi)容有一定的難度,必須是在前幾章知識(shí)掌握較好的情況下才能輕松進(jìn)入本章的學(xué)習(xí)。就目前網(wǎng)絡(luò)的發(fā)展而言,學(xué)習(xí)網(wǎng)絡(luò)編程技術(shù)已成為在軟件道路上發(fā)展的必經(jīng)之路,而數(shù)據(jù)庫技術(shù)又是網(wǎng)絡(luò)編程的核心技術(shù),本章的內(nèi)容又是SQLServer中的關(guān)鍵技術(shù)。因此,本章在整個(gè)教程中的地位很重要,一定要認(rèn)真完成章后的習(xí)題,這樣能使知識(shí)掌握得更加牢固。小結(jié)數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用53數(shù)據(jù)共享數(shù)據(jù)獨(dú)立最小冗余

數(shù)據(jù)安全

數(shù)據(jù)完整

靈活性和可恢復(fù)性

數(shù)據(jù)庫技術(shù)及網(wǎng)絡(luò)應(yīng)用

數(shù)據(jù)共享數(shù)據(jù)庫技術(shù)及網(wǎng)絡(luò)應(yīng)用

章節(jié)目錄數(shù)據(jù)庫技術(shù)7.1游標(biāo)

7.2存儲(chǔ)過程

7.3觸發(fā)器

第7章SQLServer高級(jí)應(yīng)用

7.1.1游標(biāo)概述7.1.2聲明游標(biāo)7.1.3打開游標(biāo)

7.2.1存儲(chǔ)過程概述

7.2.2存儲(chǔ)過程的創(chuàng)建與執(zhí)行

7.2.3實(shí)例:不帶參數(shù)的存儲(chǔ)過程

7.1.4讀取游標(biāo)數(shù)據(jù)

7.1.5實(shí)例:定義一個(gè)滾動(dòng)游標(biāo)

7.2.4實(shí)例:帶輸入?yún)?shù)的存儲(chǔ)過程7.2.5實(shí)例:帶輸入和輸出參數(shù)的存儲(chǔ)過程7.4事務(wù)處理

小結(jié)

7.1.6實(shí)例:讀取游標(biāo)中的數(shù)據(jù)存入變量中

7.1.7利用游標(biāo)更新數(shù)據(jù)和刪除數(shù)據(jù)

7.1.8實(shí)例:利用游標(biāo)統(tǒng)計(jì)數(shù)據(jù)行數(shù)

7.1.9關(guān)閉游標(biāo)和釋放游標(biāo)7.1.10實(shí)例:利用游標(biāo)刪除表中的一行7.2.6存儲(chǔ)過程的修改、重命名和刪除

7.2.7實(shí)例:修改存儲(chǔ)過程

7.2.8實(shí)例:重命名和刪除存儲(chǔ)過程章節(jié)目錄數(shù)據(jù)庫技術(shù)7.1游標(biāo)7.2存儲(chǔ)過程7.355章節(jié)目錄數(shù)據(jù)庫技術(shù)7.1游標(biāo)

7.2存儲(chǔ)過程

7.3觸發(fā)器

第7章SQLServer高級(jí)應(yīng)用

7.3.1觸發(fā)器概述

7.3.2觸發(fā)器的工作原理

7.3.3觸發(fā)器的創(chuàng)建與執(zhí)行

7.4.1事務(wù)概述

7.4.2事務(wù)屬性

7.4.3事務(wù)控制語句

7.3.4實(shí)例:顯示功能觸發(fā)器7.3.5觸發(fā)器的修改、刪除和顯示

7.4.4實(shí)例:事務(wù)編程

7.4.5事務(wù)并發(fā)處理與并發(fā)控制

7.4事務(wù)處理

小結(jié)

7.3.7實(shí)例:更新功能觸發(fā)器7.3.6實(shí)例:插入功能觸發(fā)器章節(jié)目錄數(shù)據(jù)庫技術(shù)7.1游標(biāo)7.2存儲(chǔ)過程7.356本章提要數(shù)據(jù)庫技術(shù)本章通過大量實(shí)例介紹SQL語句的高級(jí)應(yīng)用,包括游標(biāo)、存儲(chǔ)過程、觸發(fā)器、事務(wù)處理的功能及基本操作。它們是網(wǎng)絡(luò)數(shù)據(jù)庫編程的重要內(nèi)容,是開發(fā)網(wǎng)絡(luò)數(shù)據(jù)庫應(yīng)用程序的關(guān)鍵技術(shù)。第7章SQLServer高級(jí)應(yīng)用7.1游標(biāo)

7.2存儲(chǔ)過程

7.3觸發(fā)器

7.4事務(wù)處理

小結(jié)

本章提要數(shù)據(jù)庫技術(shù)本章通過大量實(shí)例介紹SQL語57數(shù)據(jù)庫技術(shù)7.1游標(biāo)7.1.1游標(biāo)概述游標(biāo)是類似于C語言指針一樣的結(jié)構(gòu),面對包括多條數(shù)據(jù)記錄的結(jié)果集,游標(biāo)能完成每次只提取一條記錄的操作。游標(biāo)由兩部分組成:結(jié)果集和在結(jié)果集中指向某一記錄位置的指針。游標(biāo)提供了一種在服務(wù)器內(nèi)部處理結(jié)果集的方法,它可以識(shí)別一個(gè)數(shù)據(jù)集合內(nèi)部指定的工作行,從而可以有選擇地按行采取操作。第七章SQLServer高級(jí)應(yīng)用數(shù)據(jù)庫技術(shù)7.1游標(biāo)7.1.1游標(biāo)概述58數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用7.1.2聲明游標(biāo)在使用游標(biāo)之前首先要聲明游標(biāo)。用T-SQL聲明游標(biāo)的語法如下:declare游標(biāo)名[insensitive][scroll]cursorforselect語句[forreadonly|update[of列名1,列名2.……]]語法注釋:游標(biāo)名為聲明的游標(biāo)取的名字,游標(biāo)名必須符合標(biāo)識(shí)符的命名規(guī)則。[insensitive]使用insensitive定義的游標(biāo),會(huì)將提取出來的數(shù)據(jù)存放在系統(tǒng)數(shù)據(jù)庫tempdb創(chuàng)建的一個(gè)臨時(shí)表里。任何通過該游標(biāo)進(jìn)行的操作都在臨時(shí)表里進(jìn)行,因此所有對基本表的改動(dòng)都不會(huì)在游標(biāo)中體現(xiàn)出來。[scroll]使用scroll定義的游標(biāo),稱為滾動(dòng)游標(biāo),可以提取任意位置的數(shù)據(jù)行。若無此關(guān)鍵字,只能按順序提取。select語句指標(biāo)準(zhǔn)的select語句,用來定義游標(biāo)所要處理的結(jié)果集。readonly聲明只讀游標(biāo),不允許通過游標(biāo)進(jìn)行數(shù)據(jù)更新。update[of列名1,列名2.……]聲明可更新的游標(biāo)中允許更新的列。若只選update,則所有的列都可更新。

數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用7.1.259數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用在使用游標(biāo)之前,必須先打開游標(biāo)。利用T-SQL打開游標(biāo)的語法格式:open游標(biāo)名功能注釋:當(dāng)執(zhí)行打開游標(biāo)的語句時(shí),服務(wù)器執(zhí)行聲明游標(biāo)時(shí)使用的select語句。此時(shí),用游標(biāo)提取數(shù)據(jù)的當(dāng)前位置是數(shù)據(jù)集的第一條記錄。7.1.3打開游標(biāo)數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用在使用游標(biāo)之60數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用語法注釋:(1)使用scroll關(guān)鍵字聲明的游標(biāo),具有以下所有的取數(shù)功能:

first取第一行數(shù)據(jù)

prior取前一行數(shù)據(jù)

next取下一行數(shù)據(jù)

last取最后一行數(shù)據(jù)

absolute<n>按絕對位置取數(shù)據(jù),從游標(biāo)中取出第n行記錄

relative<n>按相對位置取數(shù)據(jù),讀出從游標(biāo)當(dāng)前位置向后第行記錄。(2)[into變量名表]使用into子句對變量賦值時(shí),變量的數(shù)量、類型、順序必須和聲明游標(biāo)時(shí)使用的select語句輸出的列項(xiàng)一一對應(yīng)。7.1.4讀取游標(biāo)數(shù)據(jù)打開游標(biāo)之后,就可以用游標(biāo)讀取數(shù)據(jù)了。利用T-SQL讀取游標(biāo)的語法如下:fetch[first|prior|next|last]|[absolutetn|relativen]from游標(biāo)名[into變量名表]數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用語法注釋:761數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用程序構(gòu)思:本例聲明一個(gè)游標(biāo),用來逐條顯示“學(xué)生表”中性別為“女”的記錄。操作步驟:(1)單擊【開始】→【所有程序】→【MicrosoftSQLServer2005】→【SQLServerManagementStudio】,打開【連接到服務(wù)器】對話框,單擊【連接】鈕,彈出【MicrosoftSQLServerManagementStudio】管理器窗口。(2)單擊常用工具欄中的鈕,則建立了一個(gè)數(shù)據(jù)庫引擎查詢文檔,文檔名默認(rèn)為

SQLQuery1.sql。7.1.5實(shí)例:定義一個(gè)滾動(dòng)游標(biāo)數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用程序構(gòu)思:762數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用(3)在SQLQuery1.sql文檔界面輸入代碼:use學(xué)生成績管理declarecursor1scrollcursorforselect*from學(xué)生表where性別='女'opencursor1fetchfirstfromcursor1while@@fetch_status=0beginfetchnextfromcursor1end(4)單擊工具欄上的按鈕,或按F5鍵@@fetch_status是一個(gè)全局變量,若其值為0,則表示fetch命令被成功執(zhí)行。數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用(3)在SQ63數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用7.1.6實(shí)例:讀取游標(biāo)中的數(shù)據(jù)存入變量中程序構(gòu)思:本例聲明的游標(biāo),其結(jié)果集為選修“三維動(dòng)畫設(shè)計(jì)”課程成績最高的學(xué)生的學(xué)號(hào)、姓名、課程名稱和成績,并將從游標(biāo)中讀取的數(shù)據(jù)存放到局部變量中,再輸出變量中的值。操作步驟:(1)單擊【開始】→【所有程序】→【MicrosoftSQLServer2005】→【SQLServerManagementStudio】,打開【連接到服務(wù)器】對話框,單擊【連接】鈕,彈出【MicrosoftSQLServerManagementStudio】管理器窗口。(2)單擊常用工具欄中的鈕,則建立了一個(gè)數(shù)據(jù)庫引擎查詢文檔,文檔名默認(rèn)為SQLQuery1.sql。數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用7.1.664數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用(3)在SQLQuery1.sql文檔界面輸入代碼:use學(xué)生成績管理declarecursor2scrollcursorforselecta.學(xué)號(hào),姓名,課程名稱,成績from學(xué)生表a,課程表b,成績表cwhere課程名稱='三維動(dòng)畫設(shè)計(jì)'andc.學(xué)號(hào)=a.學(xué)號(hào)andb.課程編號(hào)=c.課程編號(hào)

orderby成績desc

opencursor2declare@numchar(20)declare@namechar(20)declare@score_namechar(20)declare@maxintfetchfirstfromcursor2into@num,@name,@score_name,@maxselect@numas編號(hào),@nameas名字,@score_nameas課名,@maxas分?jǐn)?shù)(4)單擊工具欄上的按鈕,或按F5鍵。數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用(3)在SQ65數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用語法注釋:currentof游標(biāo)名表示當(dāng)前游標(biāo)的當(dāng)前數(shù)據(jù)行,該子句只能在update和delete操作的語句中使用。7.1.7利用游標(biāo)更新數(shù)據(jù)和刪除數(shù)據(jù)要通過游標(biāo)對數(shù)據(jù)進(jìn)行修改,該游標(biāo)必須被聲明為可更新的游標(biāo)。在聲明游標(biāo)時(shí),只要不使用forreadonly關(guān)鍵字,游標(biāo)都是可更新的。利用T-SQL更新游標(biāo)的語法格式:update表名set列名=表達(dá)式[,……]wherecurrentof游標(biāo)名利用T-SQL刪除游標(biāo)的語法格式:

deletefrom表名set列名=表達(dá)式[,……]wherecurrentof游標(biāo)名數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用語法注釋:766數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用程序構(gòu)思:本例聲明的游標(biāo),其執(zhí)行結(jié)果集為沒有被選修的課程信息,包括課程編號(hào)、課程名、學(xué)分。統(tǒng)計(jì)結(jié)果集中的數(shù)據(jù)行數(shù),并顯示相應(yīng)的提示信息。7.1.8實(shí)例:利用游標(biāo)統(tǒng)計(jì)數(shù)據(jù)行數(shù)操作步驟:(1)單擊【開始】→【所有程序】→【MicrosoftSQLServer2005】→【SQLServerManagementStudio】,打開【連接到服務(wù)器】對話框,單擊【連接】鈕,彈出【MicrosoftSQLServerManagementStudio】管理器窗口。(2)單擊常用工具欄中的鈕,則建立了一個(gè)數(shù)據(jù)庫引擎查詢文檔,文檔名默認(rèn)為SQLQuery1.sql。數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用程序構(gòu)思:767數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用(3)在SQLQuery1.sql文檔界面輸入代碼:

use學(xué)生成績管理

declarecursor3scrollcursorfor

selectdistincta.課程編號(hào),課程名稱,學(xué)分from課程表a,成績表b

wherea.課程編號(hào)notin(selectdistinct課程編號(hào)from成績表)

opencursor3fetchfirstfromcursor3while@@fetch_status=0beginfetchnextfromcursor3endselect@@cursor_rowsas'未被選修的課程數(shù)'打開游標(biāo)后,可以使用全局變量@@cursor_rows返回當(dāng)前游標(biāo)可以操作的數(shù)據(jù)行數(shù)。(4)單擊工具欄上的按鈕,或按F5鍵

數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用(3)在SQ68數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用2.釋放游標(biāo)游標(biāo)結(jié)構(gòu)本身也會(huì)占用一定的計(jì)算機(jī)資源,所以在使用完游標(biāo)后,為了回收被占用的資源,應(yīng)該將游標(biāo)釋放。利用T-SQL釋放游標(biāo)的語法格式:deallocate游標(biāo)名當(dāng)釋放完游標(biāo)以后,如果要重新使用這個(gè)游標(biāo),則必須重新執(zhí)行聲明游標(biāo)的語句。7.1.9關(guān)閉游標(biāo)和釋放游標(biāo)

1.關(guān)閉游標(biāo)在打開游標(biāo)之后,SQLServer服務(wù)器會(huì)專門為游標(biāo)開辟一定的內(nèi)存空間存放游標(biāo)操作的數(shù)據(jù)結(jié)果集,同時(shí)游標(biāo)的使用也會(huì)根據(jù)具體情況對某些數(shù)據(jù)進(jìn)行封鎖。所以,在不使用游標(biāo)的時(shí)候,一定要關(guān)閉游標(biāo),以通知服務(wù)器釋放游標(biāo)所占用的資源。利用T-SQL關(guān)閉游標(biāo)的語法格式:close游標(biāo)名關(guān)閉游標(biāo)之后,可以再次打開游標(biāo),在一個(gè)批處理中,可以多次打開和關(guān)閉游標(biāo)。數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用2.釋放游標(biāo)69數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用程序構(gòu)思:本例聲明的游標(biāo),其執(zhí)行結(jié)果集為成績最低的學(xué)生信息,包括學(xué)號(hào)、姓名、所屬院系、成績,通過游標(biāo)在成績表中將成績最低的一條記錄刪除。操作步驟:(1)單擊【開始】→【所有程序】→【MicrosoftSQLServer2005】→【SQLServerManagementStudio】,打開【連接到服務(wù)器】對話框,單擊

【連接】鈕,彈出【MicrosoftSQLServerManagementStudio】管理器窗口。(2)單擊常用工具欄中的鈕,則建立了一個(gè)數(shù)據(jù)庫引擎查詢文檔,文檔名默認(rèn)為

SQLQuery1.sql。7.1.10實(shí)例:利用游標(biāo)刪除表中的一行數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)用程序構(gòu)思:770數(shù)據(jù)庫技術(shù)第七章SQLServer高級(jí)應(yīng)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論