存储过程

存储过程在我们后端开发很常用,我们经常在开发过程中需要写存储过程,其实存储过程没啥难的,就是一个固定的格式,最难的在于存储过程中我们要写的逻辑,业务方面的东西,这些就需要我们对业务逻辑比较熟悉才行。

存储过程的代码结构如下

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
原文地址:https://www.cnblogs.com/MirZhai/p/11249033.html