随笔 - 251  文章 - 504  trackbacks - 0
<2008年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

本博客系个人收集材料及学习记录之用,各类“大侠”勿扰!

留言簿(14)

随笔分类

收藏夹

My Favorite Web Sites

名Bloger

非著名Bloger

搜索

  •  

积分与排名

  • 积分 - 200061
  • 排名 - 285

最新评论

      最近一个项目碰见要用存储过程的情况,通过重新学习。已初步完成功能,现列出来。大家给个意见。

      需求描述:数据库中有一主一从表,A和B;A和B是一对多的关系。另有和A、B结构相同的表C和表D。要实现,通过表A的主键id,把与此id值相关的记录(表A和表B中)分别更新插入到表C和表D中,同时要求有事务控制。

      分析要点:1)存储过程需要传入一个参数,id。2)表B中的记录多少不定,可能需要插入多条记录。3)整个过程需要事务控制。

      实现代码如下:
CREATE PROCEDURE query_pro_info  
 
@pi_id int
AS
begin
   
begin transaction
   
if exists (select * from pro_ent_info where PI_ID=@pi_id)
      
delete pro_ent_info where PI_ID=@pi_id
      
insert into pro_ent_info(EI_ID,EP_ID,EP_TYP,CI_ID,CI_NUM,CI_TOT,CI_TYP,PI_ID,PI_NUM,PI_NAM,PI_CLI,PI_CLI_TEL,PI_CLI_MAN,PI_ARE,PI_CAT,PI_STA,PI_MAN,PI_ADD,PI_REM,PI_CHE,PI_PLA_SPA,PI_PLA_BEG,PI_PLA_END,PI_CRE_DAT,PI_CRE_MAN,PI_MOD_DAT,PI_MOD_MAN)select EI_ID,EP_ID,EP_TYP,CI_ID,CI_NUM,CI_TOT,CI_TYP,PI_ID,PI_NUM,PI_NAM,PI_CLI,PI_CLI_TEL,PI_CLI_MAN,PI_ARE,PI_CAT,PI_STA,PI_MAN,PI_ADD,PI_REM,PI_CHE,PI_PLA_SPA,PI_PLA_BEG,PI_PLA_END,PI_CRE_DAT,PI_CRE_MAN,PI_MOD_DAT,PI_MOD_MAN from pro_info where pro_info.PI_ID=@pi_id
   
if exists (select * from pro_ent_cost where PI_ID=@pi_id)
      
delete pro_ent_cost where PI_ID=@pi_id
      
insert into pro_ent_cost(PI_ID,PC_ID,PC_DIV,PC_DIV_SEQ,PC_BUD_LAB,PC_BUD_MAT,PC_BUD_DEV,PC_BUD_CMP,PC_BUD_TOT,PC_BUD_REM,PC_PLA_LAB,PC_PLA_MAT,PC_PLA_DEV,PC_PLA_CMP,PC_PLA_TOT,PC_PLA_REM,PC_ACT_LAB,PC_ACT_MAT,PC_ACT_DEV,PC_ACT_CMP,PC_ACT_TOT,PC_ACT_REM,PC_DIV_PLA_BEG,PC_DIV_PLA_END,PC_DIV_PLA_SPA,PC_DIV_ACT_BEG,PC_DIV_ACT_END,PC_DIV_ACT_SPA,PC_DIV_SPA_ABN,PC_PRO_REC,PC_DIV_PAI,PC_DIV_SHO,PC_CHE,PC_OFF,PC_REM,PC_CRE_DAT,PC_CRE_MAN,PC_MOD_DAT,PC_MOD_MAN)select PI_ID,PC_ID,PC_DIV,PC_DIV_SEQ,PC_BUD_LAB,PC_BUD_MAT,PC_BUD_DEV,PC_BUD_CMP,PC_BUD_TOT,PC_BUD_REM,PC_PLA_LAB,PC_PLA_MAT,PC_PLA_DEV,PC_PLA_CMP,PC_PLA_TOT,PC_PLA_REM,PC_ACT_LAB,PC_ACT_MAT,PC_ACT_DEV,PC_ACT_CMP,PC_ACT_TOT,PC_ACT_REM,PC_DIV_PLA_BEG,PC_DIV_PLA_END,PC_DIV_PLA_SPA,PC_DIV_ACT_BEG,PC_DIV_ACT_END,PC_DIV_ACT_SPA,PC_DIV_SPA_ABN,PC_PRO_REC,PC_DIV_PAI,PC_DIV_SHO,PC_CHE,PC_OFF,PC_REM,PC_CRE_DAT,PC_CRE_MAN,PC_MOD_DAT,PC_MOD_MAN from pro_cost where pro_cost.PI_ID=@pi_id
   
if(@@error<>0)
      
begin
         
print('rollback transaction')
         
rollback transaction
         
return 0
       
end
       
commit transaction

end
GO

       经过调试,功能基本正常。只是事务控制处理部分不知道写的对不对。望各位指正!
posted on 2008-11-14 09:52 matthew 阅读(276) 评论(1)  编辑  收藏 所属分类: 数据库(Sql server,My sql)

FeedBack:
# re: SQL server存储过程 2008-11-14 13:28 
唐,你的论文就是事务嘛!  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: