[SQL] Procedure - 查詢後判斷後,新增資料

摘要:[SQL] Procedure - 查詢後判斷後,新增資料

最近用了Procedure 來做一個案子,內容主要是有名額限制的旅行團共三團,因為再開放報名的時候會有上百人同時上線,
以SQL來說,要先SELECT出實際現在的名額,然後確定有名額後,在新增報名資料,但同時有多人來報名,
所以必須用交易來處理,但是如果是在server端用function來處理話,單純用交易處理是不夠的,
因為我們在下select到出資料庫,資料庫回傳資料,再判斷,然後新增,雖然是短短的一秒內可完成,
但是卻可能會有和別人資料同時寫入的問題,因為用的是functioin,為了避免這種情形,就寫了一個Procedure,
同時完成SELECT和INSERT還有判斷,主機是MS-SQL:


drop  proc chk_insert   這邊是刪除叫做chk_insert的Procedure,因為我有新增過
go  執行上面的指令
create proc chk_insert 新增叫做chk_insert的Procedure
 @yy int,@member_id nvarchar(50),@trip_id int,@isfriend nvarchar(50),@true_num int output  宣告變數,@true_num為輸出變數
 
as
begin tran
 開始交易處理
select  @true_num=true_num from view_trip where idnum = @trip_id  and yy=@yy and status = '0' and enable ='1'  and true_num>0
執行SELECT,判斷人數是否大於0
if @@rowcount >0  如果查詢到資料,便新增報名資料
begin
 insert into trip_list (member_id,yy,trip_id,creater,isfriend)  values(@member_id,@yy,@trip_id,@member_id,@isfriend)
end
commit tran
go 
到此結束Procedure,會在資料庫中,新增一個Procedure物件

以下為傳遞變數的方法
declare @int_true int
 宣告@int_true 來接收@true_num
exec chk_insert  @yy=2009,@member_id='0123',@trip_id=1,@isfriend='n',@true_num=@int_true output  執行chk_insert這個Procedure並傳函數
select @int_true 'num'  抓@int_true 傳出的資料

結果:
num
======
數值或NULL