掃二維碼與項(xiàng)目經(jīng)理溝通
我們在微信上24小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
Sybase系統(tǒng)具有完備的觸發(fā)器、存儲(chǔ)過程、規(guī)則以及完整性定義,支持優(yōu)化查詢,具有較好的數(shù)據(jù)安全性??梢奡ybase的功能性是很好的,本文將主要圍繞Sybase的存儲(chǔ)講起。

存儲(chǔ)過程的特點(diǎn)
Sybase的存儲(chǔ)過程是集中存儲(chǔ)在SQL Server中的預(yù)先定義且已經(jīng)編譯好的事務(wù)。存儲(chǔ)過程由SQL語句和流程控制語句組成。它的功能包括:接受參數(shù);調(diào)用另一過程;返回一個(gè)狀態(tài)值給調(diào)用過程或批處理,指示調(diào)用成功或失敗;返回若干個(gè)參數(shù)值給調(diào)用過程或批處理,為調(diào)用者提供動(dòng)態(tài)結(jié)果;在遠(yuǎn)程SQL Server中運(yùn)行等。
存儲(chǔ)過程的性能特點(diǎn)如下:
所以,存儲(chǔ)過程大大增強(qiáng)了SQL語言的功能、效率和靈活性。掌握和應(yīng)用好存儲(chǔ)過程,對進(jìn)一步發(fā)揮Sybase數(shù)據(jù)庫系統(tǒng)的強(qiáng)大功能有著重要的意義。
存儲(chǔ)過程的語法規(guī)則
建立存儲(chǔ)過程的語法規(guī)則為:
CREATE PROCedure[owner.]procedurename[;number]
[[(]@parameter_name datatype[=default][OUTput]
[,@parameter_name datatype[=default][OUTput]]...[)]]
[WITH RECOMPILE]
AS SQL_statements
使用存儲(chǔ)過程的語法規(guī)則為:
[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]下面簡要介紹這兩個(gè)命令的常用選項(xiàng)以及建立和使用存儲(chǔ)過程的要點(diǎn),關(guān)于選項(xiàng)的更為詳細(xì)的說明請參考有關(guān)手冊。
存儲(chǔ)過程的建立和使用,我們將通過幾個(gè)例子進(jìn)行介紹。
假設(shè)有一個(gè)用下述語句生成的技能工資表RS-LS-GZ-JiNeng:
create table RS_LS_GZ_JiNeng /*技能工資表*/
(GeRen_id char(4), /*個(gè)人代碼 */
RiQi smalldatetime, /*執(zhí)行日期 */
YuanYin_id char(1) null, /*變動(dòng)原因代碼 */
JinE smallmoney) /*技能工資金額 */
該表存儲(chǔ)著某單位員工多年來技能工資的歷史檔案。
#p#
例1.如果要查詢?nèi)w員工的技能工資變動(dòng)歷史,則可先建立一個(gè)存儲(chǔ)過程p-RsGz-JiNeg-All:
create procedure p_RsGz_JiNeng_All as
select *
from RS_LS_GZ_JiNeng
order by GeRenid,RiQi
然后用批處理語句調(diào)用存儲(chǔ)過程p_RsGz_JiNeng_All進(jìn)行查詢:
execute p_RsGz_JiNeng_All
本例只顯示查詢到的數(shù)據(jù),無輸入、輸出參量,是最簡單的一個(gè)存儲(chǔ)過程。
例2.如果要查詢某人技能工資的變動(dòng)歷史,可建立另一個(gè)存儲(chǔ)過程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
之后用批處理語句調(diào)用存儲(chǔ)過程p_Rs_Gz_JiNeng進(jìn)行查詢:
declare @GeRenId char(4)
select @GeRenId="0135" /*設(shè)要查詢員工的個(gè)人代碼為"0135" */
execute p_RsGz_JeNeng @c_GeRenId=@GeRenId
存儲(chǔ)過程p_RsGz_JiNeng中定義了一個(gè)形參@c_GeRenId,是字符型變量。在調(diào)用該過程的批處理中,既可以用具體的值也可以用變量作為實(shí)參。用變量作實(shí)參(如本例)時(shí),必須用del are語句加以說明。值得注意的是,在批處理的調(diào)用過程語句中,@c_GeRenId=@GeRenId中的@ c_GeRenId是存儲(chǔ)過程p_RsGz_JiNeng中的形參名,不是批處理中的變量,所以不能將它列入d eclare語句的變量單中。
例3.如果要計(jì)算當(dāng)月工資,就必須從工資歷史中查出員工距離當(dāng)前最近的一次技能工資變動(dòng)的結(jié)果:
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)/*找出歷史記錄中距離當(dāng)前最近的日期*/
調(diào)用存儲(chǔ)過程p_RsGz_JiNeng_Slt進(jìn)行查詢:
declare @GeRenId char(4),@JinE smallmoney
select @GeRenid="0135"/*設(shè)要查詢員工的個(gè)人代碼為"0135"*/
select @JinE=0
execute p_RsGz_JiNeng_slt @c_GeRenId=@GeRenId,@sm_JinE=@ JinE output
這里,變量 @JinE用來存儲(chǔ)過程形參@sm_JinE傳回的金額。在調(diào)用過程語句中,@sm_JiE = @JinE output中的output不可省略。否則,變量@JinE將得不到形參傳回的數(shù)值而始終為零(等于初值)。
例4.查到了個(gè)人代碼為"0135"員工的技能工資就顯示其歷史紀(jì)錄,查不到則顯示一條出錯(cuò)信息。
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
調(diào)用存儲(chǔ)過程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!"
存儲(chǔ)過程p_RsGz_JiNeng_Rtn向調(diào)用者返回一個(gè)存儲(chǔ)在變量@ErrCode里的值,這個(gè)值被稱為狀態(tài)值,它向調(diào)用者反映存儲(chǔ)過程執(zhí)行的成敗狀態(tài)。在本例中,如果查不到指定員工技能工資的任何記錄時(shí),就認(rèn)為"查無此人",返回出錯(cuò)狀態(tài)值1。否則,返回成功狀態(tài)值0。
調(diào)用過程的批處理語句使用變量@RtnCode存儲(chǔ)返回的狀態(tài)值,一旦檢出存儲(chǔ)過程p_RsG_ JiNeng_Rtn返回了錯(cuò)誤標(biāo)志(@RtnCode=1),就顯示一條信息"No this one!"。[page]
小結(jié)
上述四個(gè)例子簡要介紹了存儲(chǔ)過程常用的幾種形式,從中我們已經(jīng)可以領(lǐng)略到它的編程特色以及使用上的靈活性和方便性。
雖然上述例子在調(diào)用存儲(chǔ)過程時(shí)都是用SQL的批處理語句實(shí)現(xiàn)的,但并不意味著這是唯一的方法。例如在存儲(chǔ)過程中調(diào)用存儲(chǔ)過程(即所謂過程嵌套)的現(xiàn)象就很常見。另外,在其它Sybase數(shù)據(jù)庫開發(fā)系統(tǒng) (如PowerBuilder)的 script語句中調(diào)用Sybase的存儲(chǔ)過程也非常普遍。
上文中就Sybase存儲(chǔ)過程的建立和使用作出了詳細(xì)的介紹,同時(shí),為了更利于大家理解,就通過實(shí)例的分析介紹給大家講述Sybase的存儲(chǔ)的建立和使用,希望對大家能夠有所幫助。

我們在微信上24小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流