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