簡單建立儲存過程範例

2021-06-22 08:18:36 字數 2252 閱讀 1837

alter procedure  [dbo].[usp_syn_kmbs]

@batchid int --輸入引數 --如果宣告output為輸出引數

asbegin

declare @username varchar --宣告變數

declare @cellphone varchar

declare @storecode varchar

declare @sid int

declare cur cursor for --定義游標

select [sid],username, cellphone,storecode from kmbs_source where bathcid=@batchid

open cur--開啟游標

fetch next from cur into @sid,@username,@cellphone,@storecode --把提取操作的列資料放到區域性變數中

while(@@fetch_status=0) --游標讀取下一條資料是否成功

begin

declare @isin int

declare @autoid int

select @isin=isnull([dkr_id],0) from [kmbs_register] where [dkr_cellphone]=@cellphone

if @isin=0

begin

insert into [kmbs_register]

([dkr_sid]

,[dkr_name]

,[dkr_nickname]

,[dkr_cellphone]

,[dkr_storecode]

,[createdate]

,[updatedate]

,[dkr_isnew]

,[dkr_isfinish]

,[dkr_caller],*****id)

values(@sid,@username,@username,@cellphone,@storecode,getdate(),getdate(),0,0,0,@batchid)

select @autoid= @@identity

select @isin=isnull(dre_id,0) from register where dre_cellphone=@cellphone

if @isin>0

begin

update [kmbs_register] set dkr_dre_id=@isin where dkr_id=@autoid

end

endelse

begin

update kmbs_source set isin=@isin where [sid]=@sid

endfetch next from cur into @sid,@username,@cellphone,@storecode --讀取下一條資料記錄放到區域性變數中,變數的數目必須與游標選擇列表中的列的數目一致

endclose cur--關閉游標

deallocate cur--刪除游標

update kmbs_batch set

repeatnumber=(select count(*) from kmbs_source where batchid=@batchid and isin is not null)

,successnumber=(select count(*) from kmbs_register where batchid=@batchid)

,updatedate=getdate()

,total=(select count(*) from kmbs_source where batchid=@batchid)

,[state]=2

where batchid=@batchid

end

整體看上去沒有錯誤,但細心的童鞋會發現問題:

1、varchar未定義長度

2、if @isin=0 會不被執行,因為查出來的結果集有可能為null 故在下面做一下處理set @isin = isnull(@isin,0) 補救.

3、 由於 select @isin=isnull([dkr_id],0) 不會被執行,所以導致變數一直不會更新

所以在查詢之前先設定一下:set @isin=null 最後進行一下優化處理:在頭部宣告時加上set nocount on;

SQLServer 建立儲存過程範例

use 資料庫名稱 goset ansi nulls on goset quoted identifier on gocreate procedure dbo 儲存過程名稱 引數名稱1 char 20 引數名稱2 資料型別 長度 as begin 定義變數 declare 變數名稱 資料型別 長度 ...

mysql簡單儲存過程範例

範例 begin 定義引數 declare carid int 10 declare v count int declare done int default 1 乙個游標 cursor 可以被看作指向結果集 a set of rows 中一行的指標 pointer declare logistic...

mysql 儲存過程 範例

範例 drop procedure if exists proc delimiter 設定mysql 結束符 否則有可能報莫名其妙的 near at line 錯誤 create oracle or replace procedure proc in iid int,in ipid int out ...