sybase儲存過程

pentium發表於2007-01-30
儲存過程的特點
  Sybase的儲存過程是集中儲存在SQL Server中的預先定義且已經編譯好的事務。儲存過程由SQL語句和流程控制語句組成。它的功能包括:接受引數;[@more@]呼叫另一過程;返回一個狀態值給呼叫過程或批處理,指示呼叫成功或失敗;返回若干個引數值給呼叫過程或批處理,為呼叫者提供動態結果;在遠端SQL Server中執行等。

儲存過程的效能特點如下
  儲存過程是預編譯過的,這就意味著它與普通的SQL語句或批處理的SQL語句不同,當首次執行一個儲存過程時,SQL Server的查詢處理器對其進行分析,在排除了語法錯誤之後形成儲存在系統中的可執行方案。由於查詢處理的大部分工作已經完成,所以儲存過程執行速度很快。

儲存過程和待處理的資料都放在同一臺執行SQL Server的計算機上,使用儲存過程查詢當地的資料,效率自然很高。

儲存過程一般多由Client端透過儲存過程的名字進行呼叫,即跨網傳送的只是儲存過程的名字及少量的引數(如果有的話),而不是構成儲存過程的許多SQL語句,因此可以減少網路傳輸量,加快系統響應速度。

儲存過程還有著如同C語言子函式那樣的被呼叫和返回值的方便特性。

所以,儲存過程大大增強了SQL語言的功能、效率和靈活性。掌握和應用好儲存過程,對進一步發揮Sybase資料庫系統的強大功能有著重要的意義。

儲存過程的語法規則 ,建立儲存過程的語法規則為:
CREATE PROCedure[owner.]procedurename[;number]
[[(]@parameter_name datatype[=default][OUTput]
[,@parameter_name datatype[=default][OUTput]]...[)]]
[WITH RECOMPILE]
AS SQL_statements


使用儲存過程的語法規則為:
[EXECute][@return-status=]
[[[server.]database.]owner.]procedurename[;number]
[[@parameter_name=]value|[@parameter_name=]@varialbe[OUTput]
[,[@parameter_name=]value|[@parameter_name=]@variable[OUTput]...]]
[WITH RECOMPILE]


[page]下面簡要介紹這兩個命令的常用選項以及建立和使用儲存過程的要點,關於選項的更為詳細的說明請參考有關手冊。

[[[server.]database.]owner.]procedure_name:儲存過程的名字。

@parameter_name datatype[=default][OUTput]:形式引數(形參)的名稱、型別。df ault是賦予的預設值(可選),OUTput指定本引數為輸出引數(可選)。形參是儲存過程中的自變數,可以有多個,名字必須以@打頭,最長30個字元。

SQL_statements:定義儲存過程功能的SQL語句。

@return_status:接受儲存過程返回狀態值的變數。

[@parameter_name=]value:實際引數(實參),@parameter_name為實參的名稱(可選)。如果某個實參以@parameter_name=value提供,那麼隨後的實參也都要採用這一形式提供。

[@parameter_name=]@varialbe[OUTput]:將變數@varialbe中的值作為實參傳遞給形參@parameter_name(可選),如果變數@varialbe是用來接受返回的引數值,則選項OUTput不可缺少。

儲存過程的建立和使用,我們將透過幾個例子進行介紹。

假設有一個用下述語句生成的技能工資表RS-LS-GZ-JiNeng:

create table RS_LS_GZ_JiNeng     /*技能工資表*/
(GeRen_id char(4),         /*個人程式碼 */
RiQi smalldatetime,         /*執行日期 */
YuanYin_id char(1) null,       /*變動原因程式碼 */
JinE smallmoney)           /*技能工資金額 */
該表儲存著某單位員工多年來技能工資的歷史檔案。

例1.如果要查詢全體員工的技能工資變動歷史,則可先建立一個儲存過程p-RsGz-JiNeg-All:
create procedure p_RsGz_JiNeng_All as
select * from RS_LS_GZ_JiNeng order by GeRenid,RiQi

然後用批處理語句呼叫儲存過程p_RsGz_JiNeng_All進行查詢:
execute p_RsGz_JiNeng_All
本例只顯示查詢到的資料,無輸入、輸出參量,是最簡單的一個儲存過程。 [page]

例2.如果要查詢某人技能工資的變動歷史,可建立另一個儲存過程p_RsGz_JiNeng:
create procedure p_RsGz_JiNeng @c_GeRenId char(4)
as
select * from RS_LS_GZ_JiNeng where GeRen_id=@c_GeRenId order by RiQi
之後用批處理語句呼叫儲存過程p_Rs_Gz_JiNeng進行查詢:

declare @GeRenId char(4)
select @GeRenId="0135" /*設要查詢員工的個人程式碼為"0135" */
execute p_RsGz_JeNeng @c_GeRenId=@GeRenId


儲存過程p_RsGz_JiNeng中定義了一個形參@c_GeRenId,是字元型變數。在呼叫該過程的批處理中,既可以用具體的值也可以用變數作為實參。用變數作實參(如本例)時,必須用del are語句加以說明。值得注意的是,在批處理的呼叫過程語句中,@c_GeRenId=@GeRenId中的@ c_GeRenId是儲存過程p_RsGz_JiNeng中的形參名,不是批處理中的變數,所以不能將它列入d eclare語句的變數單中。

例3.如果要計算當月工資,就必須從工資歷史中查出員工距離當前最近的一次技能工資變動的結果:
create procedure p_RsGz_JiNeng_Slt
(@c_GeRenId char(4),@sm_JinE smallmoney output)
as
select @sm_JinE=JinE from RS_LS_GZ_JiNeng
where RiQi=(select max(RiQi) from RS_LS_GZ_JiNeng where GeRenid=@c-GeRenId)
/*找出歷史記錄中距離當前最近的日期*/


呼叫儲存過程p_RsGz_JiNeng_Slt進行查詢:
declare @GeRenId char(4),@JinE smallmoney
select @GeRenid="0135"/*設要查詢員工的個人程式碼為"0135"*/
select @JinE=0
execute p_RsGz_JiNeng_slt @c_GeRenId=@GeRenId,@sm_JinE=@ JinE output

這裡,變數 @JinE用來儲存過程形參@sm_JinE傳回的金額。在呼叫過程語句中,@sm_JiE = @JinE output中的output不可省略。否則,變數@JinE將得不到形參傳回的數值而始終為零(等於初值)。 [page]

例4.查到了個人程式碼為"0135"員工的技能工資就顯示其歷史紀錄,查不到則顯示一條出錯資訊。
create procedure p_RsGz_JiNeng_Rtn
@c_GeRenId char(4)
as
declare @ErrCode smallint
select @ErrCode=0
if exists(select* from RS-LS-GZ-JiNeng where GeRenid=@c-GeRenId)
begin
select * from RS_LS_GZ_JiNeng whrer GeRen_id=@c_GeRenId order by RiQi
return @ErrCode
end
esle
begin
select @ErrCode=1
return @ErrCode
end

呼叫儲存過程p_RsGz_JiNeng_Rtn:
declare @GeRenId char(4),@RtnCode smallint
select @GeRenId="0135"
select @RtnCode=0
execute @RtnCode=p_RsGz_JiNeng_Rtn @c_GeRenId=@GeRenId
if @RtnCode=1
print"No this one!"

儲存過程p_RsGz_JiNeng_Rtn向呼叫者返回一個儲存在變數@ErrCode裡的值,這個值被稱為狀態值,它向呼叫者反映儲存過程執行的成敗狀態。在本例中,如果查不到指定員工技能工資的任何記錄時,就認為"查無此人",返回出錯狀態值1。否則,返回成功狀態值0。

呼叫過程的批處理語句使用變數@RtnCode儲存返回的狀態值,一旦檢出儲存過程p_RsG_ JiNeng_Rtn返回了錯誤標誌(@RtnCode=1),就顯示一條資訊"No this one!"。 [page]

小結
  上述四個例子簡要介紹了儲存過程常用的幾種形式,從中我們已經可以領略到它的程式設計特色以及使用上的靈活性和方便性。

雖然上述例子在呼叫儲存過程時都是用SQL的批處理語句實現的,但並不意味著這是唯一的方法。例如在儲存過程中呼叫儲存過程(即所謂過程巢狀)的現象就很常見。另外,在其它Sybase資料庫開發系統 (如PowerBuilder)的 script語句中呼叫Sybase的儲存過程也非常普遍。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14377/viewspace-896050/,如需轉載,請註明出處,否則將追究法律責任。

相關文章