|
SQL是一種非過(guò)程性語(yǔ)言,有很強(qiáng)的表達(dá)能力,。隨著基于數(shù)據(jù)庫(kù)的應(yīng)用邏輯日益復(fù)雜,在應(yīng)用中僅僅使用順序執(zhí)行的SQL語(yǔ)句序列表現(xiàn)出很大的局限性,。減少局限性的方法之一是使用SQL標(biāo)準(zhǔn)的存儲(chǔ)過(guò)程(stored procedure)和SQL/PSM(persistent stored module,持久存儲(chǔ)模塊)技術(shù)。 |
|
5.7.1 數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程與函數(shù) |
|
|
1.緣由 (1)現(xiàn)在數(shù)據(jù)庫(kù)系統(tǒng)往往采用客戶機(jī)/服務(wù)器計(jì)算模式,,很多工作可以在客戶端完成,也可以在服務(wù)器端完成,。 (2)客戶機(jī)/服務(wù)器系統(tǒng)與傳統(tǒng)的數(shù)據(jù)庫(kù)系統(tǒng)的一個(gè)很重要的區(qū)別是:在傳統(tǒng)的數(shù)據(jù)庫(kù)系統(tǒng)中只存放數(shù)據(jù),,所有的應(yīng)用程序都在用戶端,都與用戶實(shí)際運(yùn)行的應(yīng)用程序捆綁在一起,;而在客戶機(jī)/服務(wù)器系統(tǒng)中,,在數(shù)據(jù)庫(kù)中還存放程序,由于這種程序以數(shù)據(jù)庫(kù)對(duì)象的形式存儲(chǔ)在數(shù)據(jù)庫(kù)中,,因此稱為存儲(chǔ)過(guò)程,。 (3)存儲(chǔ)過(guò)程是使用SQL語(yǔ)句和流程控制語(yǔ)句編寫的模塊,,存儲(chǔ)過(guò)程經(jīng)編譯和優(yōu)化后存儲(chǔ)在數(shù)據(jù)庫(kù)服務(wù)器端的數(shù)據(jù)庫(kù)中,,使用時(shí)調(diào)用即可,。 |
2.使用存儲(chǔ)過(guò)程的優(yōu)點(diǎn) (1)提高運(yùn)行速度 在運(yùn)行存儲(chǔ)過(guò)程前,數(shù)據(jù)庫(kù)服務(wù)器對(duì)其進(jìn)行語(yǔ)法和語(yǔ)義分析,,并給出優(yōu)化執(zhí)行方案 而調(diào)用存儲(chǔ)過(guò)程時(shí),,其執(zhí)行SQL語(yǔ)句的大部分準(zhǔn)備工作已經(jīng)完成,所以存儲(chǔ)過(guò)程能以很快的速度執(zhí)行 相比之下,,交互執(zhí)行的SQL語(yǔ)句是解釋執(zhí)行的,,所以其速度較慢 (2)增強(qiáng)了SQL的功能和靈活性 存儲(chǔ)過(guò)程可以用流程控制語(yǔ)句編寫,,有很強(qiáng)的靈活性 能完成復(fù)雜的邏輯判斷和復(fù)雜的運(yùn)算 (3)可以降低網(wǎng)絡(luò)的通信量 存儲(chǔ)過(guò)程存儲(chǔ)在服務(wù)器端 執(zhí)行全部邏輯流程僅需要向服務(wù)器發(fā)送一次過(guò)程請(qǐng)求即可 避免了交互模式下處理邏輯執(zhí)行中額外的中間通信開(kāi)銷 (4)減輕了程序編寫的工作量 存儲(chǔ)過(guò)程可以反復(fù)調(diào)用 并可供其它前端應(yīng)用程序共享應(yīng)用邏輯 (5)間接實(shí)現(xiàn)安全控制功能 若不允許某些用戶直接在表和視圖上進(jìn)行查詢 但可授權(quán)他們執(zhí)行某個(gè)存儲(chǔ)過(guò)程來(lái)完成允許范圍內(nèi)的信息查詢 |
3.聲明存儲(chǔ)過(guò)程的一般形式 (1)申明存儲(chǔ)過(guò)程 CREATE PROCEDURE <過(guò)程名> (<參數(shù)>) <局部聲明> <過(guò)程體>; (2)申明函數(shù) CREATE FUNCTION <函數(shù)名> (<參數(shù)>) RETURNS <返回類型> <局部聲明> <函數(shù)體>; (3)調(diào)用語(yǔ)句的形式 CALL <過(guò)程名> (<參數(shù)列表>); |
|
1.順序執(zhí)行 (1)順序執(zhí)行是基本控制流程 (2)語(yǔ)句按照自然順序連續(xù)執(zhí)行 |
2.條件分支語(yǔ)句 (1)形式
IF <條件> THEN <語(yǔ)句列表> ELSEIF <條件> THEN <語(yǔ)句列表> …… ELSEIF <條件> THEN <語(yǔ)句列表> ELSE <語(yǔ)句列表> END IF; |
(2)例句
CREATE FUNCTION CourseSize(IN courseno INTEGER) RETURNS VARCHAR[7]; DECLARE NoOfStudents INTEGER; SELECT COUNT(*) INTO NoOfStudents FROM SC WHERE CNO = courseno; IF NoOfStudents > 100 THEN RETURN “HUGE” ELSEIF NoOfStudents>60 THEN RETURN “LARGE” ELSEIF NoOfStudents>20 THEN RETURN “MEDIUM” ELSE RETURN “SMALL” END IF; |
(3)說(shuō)明(針對(duì)上述程序) 第1行:IN整型參數(shù)courseno,,給出課程編號(hào) 第2行:函數(shù)返回一個(gè)字符串值,,該值描述每門課程學(xué)生人數(shù)的規(guī)模 第3行:聲明一個(gè)局部變量NoOfStudents 第4,、5行:查詢返回該門課程的學(xué)生人數(shù) 第6~9行:根據(jù)學(xué)生的數(shù)量返回以下某個(gè)值:{“HUGE”,,“LARGE”,,“MEDIUM”,,“SMALL”} |
3.循環(huán)語(yǔ)句 (1)標(biāo)準(zhǔn)的WHILE循環(huán)結(jié)構(gòu) WHILE <條件> DO <語(yǔ)句列表> END WHILE; (2)標(biāo)準(zhǔn)的REPEAT循環(huán)結(jié)構(gòu) REPEAT <語(yǔ)句列表> UNTIL <條件> END REPEAT; (3)基于游標(biāo)的循環(huán)結(jié)構(gòu) FOR <循環(huán)名> AS <游標(biāo)名> CURSOR FOR <查詢> DO <語(yǔ)句列表> END FOR; |
|
|