數(shù)據(jù)庫(kù)設(shè)計(jì) (存儲(chǔ)過(guò)程設(shè)計(jì))
6.存儲(chǔ)過(guò)程設(shè)計(jì)
存儲(chǔ)過(guò)程(Stored Procedure)是一組預(yù)先編譯好的Transact-SQL語(yǔ)句。用戶可以通過(guò)調(diào)用存儲(chǔ)過(guò)程來(lái)執(zhí)行其中的SQL語(yǔ)句。應(yīng)用存儲(chǔ)過(guò)程可以提高程序執(zhí)行速度、使程序模塊化、減少網(wǎng)絡(luò)通信量和保證系統(tǒng)的安全性。
在SQL查詢分析器中,輸入指定的Transact-SQL語(yǔ)句可以創(chuàng)建存儲(chǔ)過(guò)程。例如:
USE db_sell
GO
CREATE procedure P_ruku
@pzs int, --用于接收商品種數(shù)
@je money, --用于接收入庫(kù)金額
@sf money, --用于接收實(shí)付金額
@gysname varchar(100), --用于接收供應(yīng)商名稱
@date datetime, --用于接收入庫(kù)日期
@operator varchar(30), --用于接收操作員
@jsr varchar(30), --用于接收經(jīng)手人
@jsfs varchar(10), --用于接收結(jié)算方式
@rukuid varchar(30) output --用于輸出入庫(kù)編號(hào)
as
begin
Declare @temp varchar(30) --提取游標(biāo)中的數(shù)據(jù)
set @rukuid = 'RK'+ Convert(varchar(20),Year(@date))
if Month(@date)<10 --將月格式化為兩位數(shù)字
set @rukuid = @rukuid +'0'+ Convert(varchar(20),Month(@date))
else
set @rukuid = @rukuid+Convert(varchar(20),Month(@date))
if Day(@date)<10 --將日格式化為兩位數(shù)字
set @rukuid = @rukuid +'0'+ Convert(varchar(20),Day(@date))
else
set @rukuid = @rukuid+Convert(varchar(20),Day(@date))
--聲明一個(gè)局部游標(biāo)用于提取當(dāng)前日期的最大入庫(kù)編號(hào)
declare fetch_MaxPh Cursor LOCAL Scroll
for
select Max(rkid) from tab_ruku_main where rkdate>=
FLOOR(Convert(Float,@date)) and rkdate<Floor(Convert (Float,@date))+1
if CURSOR_STATUS('local','fetch_Maxph')= -1 --如果游標(biāo)未打開(kāi),則打開(kāi)游標(biāo)
Open fetch_Maxph
Fetch first from fetch_Maxph into @temp
Close fetch_Maxph
Declare @Id Int
if @temp is NUll
begin
set @rukuid = @rukuid+'001'
end
else
begin --確定入庫(kù)編號(hào)后3位數(shù)字的顯示格式
set @id = Convert(int,SUBSTRING(Rtrim(@temp),11,10))
if @id <9
set @rukuid = @rukuid +'00'+Convert(varchar(20),@id+1)
else if @id <99
set @rukuid = @rukuid +'0'+Convert(varchar(20),@id+1)
else
set @rukuid = @rukuid + Convert(varchar(20),@id+1)
end
--將接收到的數(shù)據(jù)添加到tab_ruku_main表中
insert into tab_ruku_main values (@rukuid,@pzs,@je,@sf,
@gysname,@date,@operator,@jsr,@jsfs)
end
GO
名為P_ruku的存儲(chǔ)過(guò)程是將接收到的數(shù)據(jù)添加到tab_ruku_main表中。由于篇幅有限,本系統(tǒng)所涉及的其他存儲(chǔ)過(guò)程可參見(jiàn)本書(shū)附帶的光盤。