存储过程在我们后端开发很常用,我们经常在开发过程中需要写存储过程,其实存储过程没啥难的,就是一个固定的格式,最难的在于存储过程中我们要写的逻辑,业务方面的东西,这些就需要我们对业务逻辑比较熟悉才行。
存储过程的代码结构如下
CREATE PROCEDURE [dbo].[存储过程名称] ( -----参数 @ReceiveAmount MONEY , --收款金额 @Result INT OUTPUT--返回值 ) AS BEGIN TRY BEGIN TRANSACTION; --判断条件 IF @ReceiveAmount > 0 BEGIN SET @Result = 1; ROLLBACK TRANSACTION; --回滚到最初状态 RETURN; END; --定义游标 DECLARE SKW_cursor CURSOR LOCAL --LOCAL指定该游标的作用域对在其中创建它的批处理、存储过程或触发器是局部的。该游标名称仅在这个作用域内有效。在批处理、存储过程、触发器或存储过程 OUTPUT 参数中,该游标可由局部游标变量引用。OUTPUT 参数用于将局部游标传递回调用批处理、存储过程或触发器,它们可在存储过程终止后给游标变量指派参数使其引用游标。除非 OUTPUT 参数将游标传递回来,否则游标将在批处理、存储过程或触发器终止时隐性释放。如果 OUTPUT 参数将游标传递回来,游标在最后引用它的变量释放或离开作用域时释放。 FOR SELECT a.FIndex , a.FContractID , a.FEntryID , a.FAmount FROM t_RPContractScheme a ORDER BY a.FIndex; --OPEN 语句填充结果集, --FETCH 从结果集返回行。 --CLOSE 语句释放与游标关联的当前结果集。 --DEALLOCATE 语句释放游标所使用的资源。 OPEN SKW_cursor; FETCH NEXT FROM SKW_cursor INTO @findex, @fcontractid, @FSchemeEntryID, @famount; --获取SKW_cursor的下一条数据,其中为字段分别赋值给对应参数 WHILE @@FETCH_STATUS = 0 --假如检索到了数据继续执行 BEGIN--1 IF ( @sumAmount < @ReceiveAmount ) BEGIN ----SQL语句 END; FETCH NEXT FROM SKW_cursor INTO @findex, @fcontractid, @FSchemeEntryID, @famount; END;--1 CLOSE SKW_cursor;--关闭游标 DEALLOCATE SKW_cursor; COMMIT TRANSACTION;--提交事务,此时数据才真正保存到数据库 END TRY BEGIN CATCH ROLLBACK TRANSACTION; --出现异常的时候,回滚到最初状态 SET @Result = 1; SELECT ERROR_NUMBER() AS ErrorNumber , ERROR_MESSAGE() AS ErrorMessage; END CATCH; GO