摘要:在學習的時候,對象出現了一個數據庫存儲過程,對這一概念不是很了解。存儲過程的參數。所有數據類型包括均可以用作存儲過程的參數。指定作為輸出參數支持的結果集由存儲過程動態構造,內容可以變化。使用選項創建的存儲過程可用作存儲過程篩選。
在學習JDBC的時候,CallableStatement對象出現了一個數據庫存儲過程,對這一概念不是很了解。所以就查閱相關資料,總結一下
什么是存儲過程?根據百度百科的解釋,存儲過程是Store Procedure,是在大型數據庫系統中,一組為了完成特定功能的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這個對象創建文本
更加詳細的內容我們看下面:
CREATE PROC [ EDURE ] procedure_name [ ; number ] [ { @parameter data_type } [ VARYING ] [ = default ] [ OUTPUT ] ] [ ,...n ] [ WITH { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ] [ FOR REPLICATION ] AS sql_statement [ ...n ]詳細說明參數
procedure_name:存儲過程的名稱,前面加#為局部存儲過程,加##全局存儲過程。
number:可選的參數,用來對同名的過程分組,以便用一條DROP PROCEDURE語句即可將同組的過程一起去除。
如:名為orders的應用程序使用的過程可以名為orderproc;1 和 orderproc;2.使用DROP PROCEDURE orderproc語句將去除整個組。
@parameter:存儲過程的參數。可以有一個或者多個。用戶必須在執行過程中提供每個所聲明參數的值(除非定義了該參數的默認值)。存儲過程最多有2100個參數。
對于參數命名的規則:要用@符號作為第一個字符,參數名必須符合標識符的規則。
data_type:參數的數據類型。所有數據類型(包括text、ntext、image)均可以用作存儲過程的參數。不過cursor數據類型只能用于OUTPU參數。如果指定數據類型為cursor,同事也必須指定VARYING和OUTPUT關鍵字。
5.VARYING:指定作為輸出參數支持的結果集(由存儲過程動態構造,內容可以變化)。僅適用于游標cursor參數
default:參數的默認值。如果定義了默認值,不必指定該參數的值就可以執行過程。默認值必須為常量或者是NULL。如果過程將該參數使用LIKE關鍵字,那么默認值中可以包含通配符(%、_ 、[]和[^])。
OUTPUT:表明參數是返回參數。該選項的值可以返回給EXEC[UTE]。使用OUTPUT參數可以將信息返回給調用過程。Text、ntext和image參數可以用作OUTPUT參數。
RECOMPILE:表明SQL Server不會緩存該過程的計劃,該過程將在運行時重新編譯,在使用非典型值或者臨時值而不希望緩存在內存中執行計劃時,請使用RECOMPILE 選項
ENCRYPTION:表示SQL Server 加密syscomments表中包含CREATE PROCEDURE語句文本的條目。使用ENCRYPTION可以防止將過程作為SQL Server賦值的一部分發布。說明在升級過程中,Sql Server利用存儲在syscomments中的加密注釋來重新創建加密過程。
FOR REPLICATION:指定不能在訂閱服務器上執行為復制創建的存儲過程。使用FOR REPLICATION選項創建的存儲過程可用作存儲過程篩選。
AS:指定過程要執行的操作
sql_statement:過程中要包含的任意數目和類型的Transact-SQL語句。但有一些限制。
實例操作現有一個Student表。
下面是無參存儲過程:
選出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存儲過程
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/17700.html
摘要:但是經過測試自身的是次秒,是一個相當不錯的數據,所以我們這里將事務直接交給,使用存儲過程來降低行級鎖的持有時間。存儲過程代碼使用存儲過程之前必須保證數據庫已經創建了存儲過程。表示使用在存儲過程中替代最后需要還原回來。 【什么是存儲過程 所謂的存儲過程是指:是一組為了完成特定功能的SQL語句集,經編譯后存儲在數據庫中,用戶通過指定存儲過程的名字并給定參數(如果該存儲過程帶有參數)來調用執...
閱讀 2664·2021-11-24 09:38
閱讀 1979·2019-08-30 15:53
閱讀 1234·2019-08-30 15:44
閱讀 3229·2019-08-30 14:10
閱讀 3579·2019-08-29 16:29
閱讀 1799·2019-08-29 16:23
閱讀 1099·2019-08-29 16:20
閱讀 1471·2019-08-29 11:13