《《數(shù)據(jù)庫系統(tǒng)概念教學》3procedu課件》由會員分享,可在線閱讀,更多相關(guān)《《數(shù)據(jù)庫系統(tǒng)概念教學》3procedu課件(33頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、單擊此處編輯母版標題樣式,單擊此處編輯母版文本樣式,第二級,第三級,第四級,第五級,*,.,*,單擊此處編輯母版標題樣式,單擊此處編輯母版文本樣式,第二級,第三級,第四級,第五級,*,.,*,單擊此處編輯母版標題樣式,單擊此處編輯母版文本樣式,第二級,第三級,第四級,第五級,*,.,*,Functions and Procedural Constructs,函數(shù)和過程結(jié)構(gòu),陳良育,.,Outline,復習:單句,SQL,總結(jié),函數(shù)和過程結(jié)構(gòu)定義、優(yōu)點和使用場景。,結(jié)構(gòu)化程序語言回顧,SQL,過程結(jié)構(gòu),變量定義,輸入輸出參數(shù),賦值語句,選擇語句,循環(huán)語句,游標,表變量,異常處理,運行和調(diào)試,實際
2、案例學習,總結(jié),.,單句,SQL,語句 總結(jié),(7)SELECT(8)DISTINCT(10),(1)FROM,(3)JOIN,(2)ON,(4)WHERE,(5)GROUP BY,(6)HAVING,(9)ORDER BY,Update t_stu set stu_name=,張三,age=20 where stu_id=2,Delete from t_stu where stu_id=2 and stu_name=,張三,Insert into t_stu(stu_id,stu_name)values(2,張三,),Create table t_stu(stu_id int,stu_nam
3、e varchar(100),Drop table t_stu,.,所學過的,SQL,關(guān)鍵字,Create,insert,select,update,delete,drop,table,Int,char,varchar,datetime,Null,is not null,is null,From,where,and,or,not,distinct,like(%),as,=,!=,between and,Group by,having,Count,sum,min,max,avg,order by,asc,desc,Join,left outer join,right outer join,ful
4、l join,in,exists,union,union all,with,case when then else,View,primary key,foreign key,constraint,check,Round,ascii,char,left,len,lower,ltrim,replace,reverse,right,rtrim,space,stuff,substring,upper,convert,datepart,getdate,All,any,some,minus,except,intersect(,能不用盡量不用,),.,過程結(jié)構(gòu),過程結(jié)構(gòu):即按照第二、三代編程語言的結(jié)構(gòu)來編寫
5、多句的,SQL,程序。,SQL1999,規(guī)范:,Function,Procedure,method 3,種數(shù)據(jù)庫對象,實現(xiàn)以上,3,種對象,可以使用數(shù)據(jù)庫內(nèi)部語言,sql,或者外部語言,(c+,java,c#,and etc).,function,routine,subroutine,method,procedure,區(qū)別,Function,Procedure.,重點。,.,存儲過程優(yōu)點,/,缺點,預編譯,存儲過程預先編譯好放在數(shù)據(jù)庫內(nèi),減少編譯所耗費的時間,.,緩存,編譯好的存儲過程會進入緩存,所以對經(jīng)常執(zhí)行的存儲過程,除了第一次執(zhí)行外,其他次執(zhí)行的速度會有明顯提高,.,減少網(wǎng)絡傳輸,特別對
6、于處理一些數(shù)據(jù)的存儲過程,不必像直接用,sql,語句實現(xiàn)那樣多次傳送數(shù)據(jù)到客戶端,.,性能更快,利用數(shù)據(jù)庫中向量化操作和眾多具有較高性能的系統(tǒng)函數(shù),.,更好的封裝,用戶不需要了解內(nèi)部具體的表和數(shù)據(jù)等信息,.,更好的安全性,防止,sql,注入。,缺點:,增加程序員學習成本,需要多學一門語言。,開發(fā)調(diào)試工具不如普通程序語言,函數(shù)庫,API,不如普通程序語言豐富。,增加數(shù)據(jù)庫的工作負載。,可移植性較差。如果換數(shù)據(jù)庫,那么需要重新編寫存儲過程或者函數(shù)。,存儲過程是天使,or,魔鬼?,Tradeoff,多層系統(tǒng)。,.,系統(tǒng),Trade-off,.,普通程序語言,(1),賦值,x=1;x:=1;x=1,選
7、擇,if(1=x)x=2;else x=3;,If,else,then,elsif,elseif,else if,begin,end,&,|,!,and,or,not.,.,普通程序語言,(2),循環(huán)語句:,while,do.while,For,foreach,.,普通程序語言,(3),函數(shù),function,函數(shù)調(diào)用,/,遞歸,.,學習程序語言的步驟,變量定義,數(shù)字,字符串。,1+1,,數(shù)字字符串相互轉(zhuǎn)化,If.else,while,for,case/switch,語句。,數(shù)組,函數(shù)定義和調(diào)用,系統(tǒng)函數(shù)庫,異常處理,看代碼,抄代碼,改代碼。,10%,高級特性。,一個語言的學習,只有在項目實踐
8、后,才能夠真正掌握。,.,SQL Server,存儲過程,(1),創(chuàng)建,Create procedure pr_t2 as select a,b from t2,執(zhí)行,Execute pr_t2,或者,exec pr_t2,刪除,Drop procedure pr_t2,修改,alter procedure pr_t2 as.,Create procedure pr_t2 as select a,b from t2,Go -,表示執(zhí)行上一句話,-,注釋,/*/,注釋,.,SQL Server,存儲過程,(2),帶參數(shù)的存儲過程,Create procedure pr_t2,stu_id int
9、,-,形式入?yún)?stu_name varchar(10),As,Begin,SET NOCOUNT ON;-,屏蔽顯示多少行受影響的信息,Select stu_id,stu_name from t_stu where stu_id=stu_id and stu_name like stu_name,End,執(zhí)行,Execute pr_t2 stu_id=1,stu_name=%tom%,Execute pr_t2 1,%tom%,.,SQL Server,存儲過程,(3),CREATE PROCEDURE pr_stu,age int,stu_id int OUTPUT,stu_id_str
10、varchar OUT,AS,set stu_id=(SELECT MAX(stu_id)from t_stu where age age);,select stu_id_str=convert(varchar,stu_id);,GO,執(zhí)行,declare a int,b varchar,exec pr_stu age=30,stu_id=a output,stu_id_str=b output,select a,b,.,SQL Server,存儲過程,(4),聲明 變量定義,全局變量 (,hungarian,命名法),Declare a int (,如果有多個變量,用逗號隔開,最后一個不要加
11、逗號,),基本賦值語句,Set a=1,或者,select a=1,Select a=count(1),b=sum(a),from t1,Select a=stu_id from t_stu;,如果只有一條記錄 那么 就把這條記錄的,stu_id,賦給,a,如果有多條記錄 那么返回最后一條記錄的,stu_id,給,a.,問題是,who is the last one?,.,SQL Server,存儲過程,(5),如果查詢不返回任何紀錄呢?,Declare a int,Select a=1,Select a=stu_id from t_stu where 1=2,Select a,變量的值沒有被
12、改變,.,SQL Server,存儲過程,(6),Update t_stu set a=age=age+1 where stu_id=2,全局變量,identity,返回最近一個,identiti,值,create table t_stu(stu_id int identity(1,1),stu_name varchar(100),age int);,Daclare stu_id int,Insert into t_stu(stu_name,age)values(Tom,20),Select stu_id=identity,error 0,成功 非零 錯誤號,rowcount sql,語句所影
13、響的行數(shù)。,.,SQL Server,存儲過程,(7),選擇語句,IF cost 1,Begin,End,.,SQL Server,存儲過程,(8),事務,Transaction,一般對,DML,有效,即,insert,update,delete.Select,不改變?nèi)魏螖?shù)據(jù),SQL Server,單句,sql,默認自動提交,顯式事務,Begin transaction,Update.,Insert.,Insert.,Commit transaction,Begin transaction,begin transaction,commit transaction,Commit transact
14、ion,.,SQL Server,存儲過程,(9),當一個存儲過程調(diào)用另外一個存儲過程,通常會發(fā)生事務嵌套調(diào)用。,在嵌套的情況下,只有當最外層的,commit,,對數(shù)據(jù)庫所有的修改才是永恒的。,SQL Server,為每個客戶端連接保存一個已打開的事務,記錄在,trancount,中,每次打開一個,,trancount,加一,每次,commit,,減一,直到最后,trancount=1,的時候,commit,保存所有的,Begin transaction transaction=1,Begin transaction transaction=2,Begin transaction transa
15、ction=3,commit transaction transaction=2,commit transaction transaction=1,Commit transaction transaction=0,.,SQL Server,存儲過程,(12),Declare cur_stu cursor,Set cur_stu=cursor for select stu_id,stu_name,age from t_stu,Open cur_stu,Fetch next from cur_stu into stu_id,stu_name,age,While(fetch_status=0)-0,
16、成功 非零 失敗,Begin,應用處理,fetch next from cur_stu into stu_id,stu_name,age,End,Close cur_stu,Deallocate cur_stu,游標很好寫,因為符合我們第三代語言,(c,c+,c#,java),的風格,但是游標實際性能很慢,因為不符合第四代描述型,SQL,向量式風格,.,SQL Server,存儲過程,(10),但是,rollback,回滾就不一樣,一個,rollback,會取消所有已經(jīng)打開的事務,Begin transaction -trancount=1,begin transaction -trancount=2,rollback transaction trancount=0,rollback transaction -,本句報錯,解決辦法,if trancount 0,rollback transaction,保存點:回滾部分事務的機制,Create procedure pr_test val int output as,Begin transaction,save transaction s