存储过程概念
?
專題:數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程的專題----http://tech.ccidnet.com/zt/guocheng/
?
?
存儲(chǔ)過(guò)程
sql語(yǔ)句執(zhí)行的時(shí)候要先編譯,然后執(zhí)行。存儲(chǔ)過(guò)程就是編譯好了的一些sql語(yǔ)句。應(yīng)用程序需要用的時(shí)候直接調(diào)用就可以了,所以效率會(huì)高。
?
存儲(chǔ)過(guò)程介紹
?
存儲(chǔ)過(guò)程是由流控制和SQL語(yǔ)句書(shū)寫的過(guò)程,這個(gè)過(guò)程經(jīng)編譯和優(yōu)化后存儲(chǔ)在數(shù)據(jù)庫(kù)服務(wù)器中,應(yīng)用程序使用時(shí)只要調(diào)用即可。在ORACLE中,若干個(gè)有聯(lián)系的過(guò)程可以組合在一起構(gòu)成程序包。
?
使用存儲(chǔ)過(guò)程有以下的優(yōu)點(diǎn):
?
* 存儲(chǔ)過(guò)程的能力大大增強(qiáng)了SQL語(yǔ)言的功能和靈活性。存儲(chǔ)過(guò)程可以用流控制語(yǔ)句編寫,有很強(qiáng)的靈活性,可以完成復(fù)雜的判斷和較復(fù)雜的 運(yùn)算。
?
* 可保證數(shù)據(jù)的安全性和完整性。
?
# 通過(guò)存儲(chǔ)過(guò)程可以使沒(méi)有權(quán)限的用戶在控制之下間接地存取數(shù)據(jù)庫(kù),從而保證數(shù)據(jù)的安全。
?
# 通過(guò)存儲(chǔ)過(guò)程可以使相關(guān)的動(dòng)作在一起發(fā)生,從而可以維護(hù)數(shù)據(jù)庫(kù)的完整性。
?
* 再運(yùn)行存儲(chǔ)過(guò)程前,數(shù)據(jù)庫(kù)已對(duì)其進(jìn)行了語(yǔ)法和句法分析,并給出了優(yōu)化執(zhí)行方案。這種已經(jīng)編譯好的過(guò)程可極大地改善SQL語(yǔ)句的性能。 由于執(zhí)行SQL語(yǔ)句的大部分工作已經(jīng)完成,所以存儲(chǔ)過(guò)程能以極快的速度執(zhí)行。
?
* 可以降低網(wǎng)絡(luò)的通信量。
?
* 使體現(xiàn)企業(yè)規(guī)則的運(yùn)算程序放入數(shù)據(jù)庫(kù)服務(wù)器中,以便:
?
# 集中控制。
?
# 當(dāng)企業(yè)規(guī)則發(fā)生變化時(shí)在服務(wù)器中改變存儲(chǔ)過(guò)程即可,無(wú)須修改任何應(yīng)用程序。企業(yè)規(guī)則的特點(diǎn)是要經(jīng)常變化,如果把體現(xiàn)企業(yè)規(guī)則的運(yùn)算程序放入應(yīng)用程序中,則 當(dāng)企業(yè)規(guī)則發(fā)生變化時(shí),就需要修改應(yīng)用程序工作量非常之大(修改、發(fā)行和安裝應(yīng)用程序)。如果把體現(xiàn)企業(yè)規(guī)則的 運(yùn)算放入存儲(chǔ)過(guò)程中,則當(dāng)企業(yè)規(guī)則發(fā)生變化時(shí),只要修改存儲(chǔ)過(guò)程就可以了,應(yīng)用程序無(wú)須任何變化。
?
數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程的實(shí)質(zhì)就是部署在數(shù)據(jù)庫(kù)端的一組定義代碼以及SQL。
?
利用SQL的語(yǔ)言可以編寫對(duì)于數(shù)據(jù)庫(kù)訪問(wèn)的存儲(chǔ)過(guò)程,其語(yǔ)法如下:
?
| CREATE PROC[EDURE] procedure_name [;number] [ {@parameter data_type} ][VARYING] [= default] [OUTPUT] ] [,...n] [WITH { RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION } ] [FOR REPLICATION] AS sql_statement [...n] |
?
?
[ ]內(nèi)的內(nèi)容是可選項(xiàng),而()內(nèi)的內(nèi)容是必選項(xiàng),
例: 若用戶想建立一個(gè)刪除表tmp中的記錄的存儲(chǔ)過(guò)程Select_delete可寫為:
?
| Create Proc select_del As Delete tmp |
?
?
例:用戶想查詢tmp表中某年的數(shù)據(jù)的存儲(chǔ)過(guò)程
?
| create proc select_query @year int as select * from tmp where year=@year |
?
?
在這里@year是存儲(chǔ)過(guò)程的參數(shù)
例:該存儲(chǔ)過(guò)程是從某結(jié)點(diǎn)n開(kāi)始找到最上層的父親結(jié)點(diǎn),這種經(jīng)常用到的過(guò)程可以由存儲(chǔ)過(guò)程來(lái)?yè)?dān)當(dāng),在網(wǎng)頁(yè)中重復(fù)使用達(dá)到共享。
空:表示該結(jié)點(diǎn)為頂層結(jié)點(diǎn)
fjdid(父結(jié)點(diǎn)編號(hào))
結(jié)點(diǎn)n 非空:表示該結(jié)點(diǎn)的父親結(jié)點(diǎn)號(hào)
dwmc(單位名稱)
?
| CREATE proc search_dwmc @dwidold int,@dwmcresult varchar(100) output as declare @stop int declare @result varchar(80) declare @dwmc varchar(80) declare @dwid int set nocount on set @stop=1 set @dwmc="" select @dwmc=dwmc,@dwid=convert(int,fjdid) from jtdw where id=@dwidold set @result=rtrim(@dwmc) if @dwid=0 set @stop=0 while (@stop=1) and (@dwid<>0) begin set @dwidold=@dwid select @dwmc=dwmc,@dwid=convert(int,fjdid) from jtdw where id=@dwidold if @@rowcount=0 set @dwmc="" else set @result=@dwmc+@result if (@dwid=0) or (@@rowcount=0) set @stop=0 else continue end set @dwmcresult=rtrim(@result) 使用exec pro-name [pram1 pram2.....] |
?
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
- 上一篇: PHP中date()函数详细参数
- 下一篇: 软硬结合有前途哈