【java學習】數據庫的存儲過程總結

在學習JDBC的時候,CallableStatement對象出現了一個數據庫存儲過程,對這一律念不是很瞭解。因此就查閱相關資料,總結一下html

什麼是存儲過程?

根據百度百科的解釋,存儲過程是Store Procedure,是在大型數據庫系統中,一組爲了完成特定功能的SQL語句集,它存儲在數據庫中,通過一次編譯後再次調用就不須要編譯了。sql

筆者認爲能夠把它認爲是一個語言的方法,它也有存儲過程名、存儲過程參數、返回值。數據庫

咱們經過指定存儲過程的名字並給出參數(若是帶的話)來執行它。緩存

存儲過程的設計規則

首先,咱們已經知道了,存儲過程是一系列sql語句的集合。咱們能夠經過存儲過程來建立其餘數據庫對象。同時也能夠在存儲過程當中建立本地臨時表,或者引用本地臨時表。若是在存儲過程內來建立本地臨時表的話,臨時表僅爲存儲過程而存在,退出該存儲過程後,臨時表將消失。服務器

存儲過程還能夠調用另外一個存儲過程,被調用的存儲過程能夠訪問訪問性能

存儲過程當中的參數的最大數目爲 2100。學習

存儲過程當中的局部變量的最大數目僅受可用內存的限制。大數據

根據可用內存的不一樣,存儲過程最大可達 128 MB加密

實現存儲過程

CREATE PROCEDURE Procedure_Name  

    --Procedure_Name爲存儲過程名(不能以阿拉伯數字開頭),在一個數據庫中觸發器名是惟一的。名字的長度不能超過個字。PROCEDURE能夠簡寫爲PROC。
     
    @Param1 Datatype,@Param2 Datatype 
    
    --@Param1和@Param2爲存儲過程的參數,Datatype爲參數類型,多個參數用逗號隔開,最多容許個參數。
    
AS --存儲過程要執行的操做 

BEGIN
    
    --BEGIN跟END組成一個代碼塊,能夠寫也能夠不寫,若是存儲過程當中執行的SQL語句比較複雜,用BEGIN和END會讓代碼更加整齊,更容易理解。

    
    
END
GO --GO就表明結操做完畢  



exec Procedure_Name [參數名] --調用存儲過程Procedure_Name。

drop procedure Procedure_Name --刪除存儲過程Procedure_Name,不能在一個存儲過程當中刪除另外一個存儲過程,只能調用另外一個存儲過程

show procedure status --顯示數據庫中全部存儲的存儲過程基本信息,包括所屬數據庫,存儲過程名稱,建立時間等

show create procedure Procedure_Name --顯示存儲過程Procedure_Name的詳細信息

exec sp_helptext Procedure_Name --顯示你這個Procedure_Name這個對象建立文本

更加詳細的內容咱們看下面:spa

CREATE PROC [ EDURE ] procedure_name [ ; number ]
    [ { @parameter data_type }
        [ VARYING ] [ = default ] [ OUTPUT ]
    ] [ ,...n ]

[ WITH
    { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]

[ FOR REPLICATION ]

AS sql_statement [ ...n ]

詳細說明參數

  1. procedure_name:存儲過程的名稱,前面加#爲局部存儲過程,加##全局存儲過程。
  2. number:可選的參數,用來對同名的過程分組,以便用一條DROP PROCEDURE語句便可將同組的過程一塊兒去除。

如:名爲orders的應用程序使用的過程能夠名爲orderproc;1orderproc;2.使用DROP PROCEDURE orderproc語句將去除整個組。

  1. @parameter:存儲過程的參數。能夠有一個或者多個。用戶必須在執行過程當中提供每一個所聲明參數的值(除非定義了該參數的默認值)。存儲過程最多有2100個參數。

對於參數命名的規則:要用@符號做爲第一個字符,參數名必須符合標識符的規則。

  1. data_type:參數的數據類型。全部數據類型(包括text、ntext、image)都可以用做存儲過程的參數。不過cursor數據類型只能用於OUTPU參數。若是指定數據類型爲cursor,同事也必須指定VARYING和OUTPUT關鍵字。

5.VARYING:指定做爲輸出參數支持的結果集(由存儲過程動態構造,內容能夠變化)。僅適用於遊標cursor參數

  1. default:參數的默認值。若是定義了默認值,沒必要指定該參數的值就能夠執行過程。默認值必須爲常量或者是NULL。若是過程將該參數使用LIKE關鍵字,那麼默認值中能夠包含通配符(%、_ 、[]和[^])。
  2. OUTPUT:代表參數是返回參數。該選項的值能夠返回給EXEC[UTE]。使用OUTPUT參數能夠將信息返回給調用過程。Text、ntext和image參數能夠用做OUTPUT參數。
  3. RECOMPILE:代表SQL Server不會緩存該過程的計劃,該過程將在運行時從新編譯,在使用非典型值或者臨時值而不但願緩存在內存中執行計劃時,請使用RECOMPILE 選項
  4. ENCRYPTION:表示SQL Server 加密syscomments表中包含CREATE PROCEDURE語句文本的條目。使用ENCRYPTION能夠防止將過程做爲SQL Server賦值的一部分發布。說明在升級過程當中,Sql Server利用存儲在syscomments中的加密註釋來從新建立加密過程。
  5. FOR REPLICATION:指定不能在訂閱服務器上執行爲複製建立的存儲過程。使用FOR REPLICATION選項建立的存儲過程可用做存儲過程篩選。
  6. AS:指定過程要執行的操做
  7. sql_statement:過程當中要包含的任意數目和類型的Transact-SQL語句。但有一些限制。

實例操做

現有一個Student表。
clipboard.png

下面是無參存儲過程:
選出Student表中全部的信息:

create proc StuProc
as //此處as可省略不寫
begin//begin和end是一對,不能夠只寫一個
select S#,Sname,Sage,Ssex from student
end
go

有參數的存儲過程:

create proc StuProc
@sname varchar(100)
as
begin
select S#,Sname,Sage,Ssex from student where sname = @sname
end
go

exec StuProc '趙雷' //執行語句

上面是在外部給變量賦值,也能夠直接在內部設置默認值

create proc StuProc
@sname varchar(100) = '趙雷'
as
begin
select S#,Sname,Ssex from student where sname = @sname
end
go

exec StuProc

也能夠把變量的內容輸出,使用output

create proc StuProc
@sname varchar(100),
@IsRight int output//傳出參數
as
if exists(select s#,Sname,Sage,Ssex from student wheere sname = @sname)
set @IsRight = 1
else
set @IsRight = 0
go

declare @IsRight int
exec StuProc '趙雷',@IsRight output
select @IsRight

幾個問題

問:存儲過程在實際項目中用的多嗎?
答:凡事都有利有弊,存儲過程也是同樣。在商業數據庫應用中,例如金融、企業、政府等等,存儲過程的使用很是普遍,有多方面的緣由,例如:存儲過程一旦調試完成經過後就能穩定運行,這與各個業務在一段時間內是相對穩定和肯定是匹配的;存儲過程大大地減小了業務系統與數據庫的交互,必定程度下降了業務系統與數據庫的耦合,例如即便業務系統與應用系統不在同一城市,對性能的影響也可控(100條SQL語句交互一次,即便延時由同城1ms增長到異地50ms,也只是增長49ms,若是交互100次,則增長4900ms)。在互聯網行業,存儲過程不多使用,一個重要的緣由是MySQL的普遍使用,而MySQL的存儲過程的功能很弱(跟商業數據庫相比);另外也跟互聯網行業變化快有必定的關係。
問:存儲過程到底有什麼用?
答:優勢是大數據量的狀況下提升計算效率,缺點是存儲過程與系統代碼分離,有時可能隨手一動存儲過程,形成與代碼的不一致,很差進行版本控制。

參考資料

何時用存儲過程---存儲過程的好處
詳細全面解析sql存儲過程

相關文章
相關標籤/搜索