如何判断已打开的事务没有rollback或者commit,已打开的游标是否关闭。我下面这样写,如果第一次运行有错误发生,则第二次运行时总是提示游标已存在。
时间:2011-11-29
来源:互联网
ALTER PROCEDURE [dbo].[WMS_TransVoucher_Check]
-- Add the parameters for the stored procedure here
@FlowNo varchar(50), --单据编号
@CheckID varchar(50), --审核人ID
@CheckName varchar(50), --审核人姓名
@SystemID int --系统标识
AS
BEGIN
-- Insert statements for procedure here
BEGIN TRANSACTION
DECLARE @rtn INT
DECLARE @BusinessDate DATETIME
DECLARE @FlowNoIn VARCHAR(50)
DECLARE @FlowNoOut VARCHAR(50)
DECLARE @cWhCodeIn VARCHAR(50)
DECLARE @cWhNameIn VARCHAR(50)
DECLARE @CanUse VARCHAR(50)
DECLARE @cWhCodeOut VARCHAR(50)
DECLARE @cWhNameOut VARCHAR(50)
DECLARE @cInvCode VARCHAR(50)
DECLARE @cInvName VARCHAR(50)
DECLARE @Barcode VARCHAR(50)
DECLARE @cInvStd VARCHAR(50)
DECLARE @BatchNo VARCHAR(50)
DECLARE @PositionsInCode VARCHAR(50)
DECLARE @PositionsInName VARCHAR(50)
DECLARE @PositionsOutCode VARCHAR(50)
DECLARE @PositionsOutName VARCHAR(50)
DECLARE @cComUnitName VARCHAR(50)
DECLARE @cComQuantity FLOAT
DECLARE @cComUnitPrice MONEY
DECLARE @mComUnitName VARCHAR(50)
DECLARE @mComQuantity FLOAT
DECLARE @RETURNCODE INT
DECLARE @RETURNMSG VARCHAR(100)
SET @BusinessDate=GETDATE()
SELECT @cWhCodeIn=cWhCodeIn,
@cWhNameIn=cWhNameIn,
@cWhCodeOut=cWhCodeOut,
@cWhNameOut=cWhNameOut,
@CanUse=CanUse
FROM WMS_TransVoucher
WHERE FlowNo=@FlowNo AND ISNULL(CheckID,'')=''
IF(@@ROWCOUNT>0)
BEGIN
--增加一张调拨入库单
EXEC WMS_GetFormNo '其它入库',@BusinessDate,@FlowNoIn output
EXEC @rtn=dbo.WMS_StockRecord_Add
@FlowNoIn,1,'103001','',@BusinessDate,@cWhCodeIn,@cWhNameIn,
'','','','','','','',@CheckID,@CheckName,@CanUse,'',@FlowNo,'','','',@SystemID,'由调拨单产生的入库单'
IF(@rtn<>1)
BEGIN
SET @RETURNCODE=-1
SET @RETURNMSG='生成其它入库单单头信息失败!'
GOTO ERROR
END
--增加一张调拨出库单
EXEC WMS_GetFormNo '其它出库',@BusinessDate,@FlowNoOut output
EXEC @rtn=dbo.WMS_StockRecord_Add
@FlowNoOut,1,'203001','',@BusinessDate,@cWhCodeOut,@cWhNameOut,
'','','','','','','',@CheckID,@CheckName,@CanUse,'',@FlowNo,'','','',@SystemID,'由调拨单产生的出库单'
IF(@rtn<>1)
BEGIN
SET @RETURNCODE=-2
SET @RETURNMSG='生成其它出库单单头信息失败!'
GOTO ERROR
END
--增加调拨单明细
DECLARE CUR_TransVouchers CURSOR FOR
SELECT cInvCode,cInvName,Barcode,cInvStd,BatchNo,PositionsInCode,PositionsInName,
cComUnitName,cComQuantity,cComUnitPrice,mComUnitName,mComQuantity
FROM WMS_TransVouchers
WHERE FlowNo=@FlowNo
OPEN CUR_TransVouchers
FETCH NEXT FROM CUR_TransVouchers
INTO @cInvCode,@cInvName,@Barcode,@cInvStd,@BatchNo,@PositionsInCode,@PositionsInName,
@cComUnitName,@cComQuantity,@cComUnitPrice,@mComUnitName,@mComQuantity
WHILE(@@FETCH_STATUS=0)
BEGIN
print @cInvCode+','+@cInvName
EXEC @rtn=dbo.WMS_StockRecords_Add
@FlowNoIn,@cInvCode,@cInvName,@Barcode,@cInvStd,@BatchNo,'','',
@PositionsInCode,@PositionsInName,@cComUnitName,@cComQuantity,@cComUnitPrice,@mComUnitName,@mComQuantity,
@CheckID,@CheckName,'',@FlowNo,@CanUse,'由调拨单产生的入库单'
IF(@rtn<>1)
BEGIN
SET @RETURNCODE=-3
SET @RETURNMSG='生成其它入库单明细信息失败!'
GOTO ERROR
END
EXEC @rtn=dbo.WMS_StockRecords_Add
@FlowNoOut,@cInvCode,@cInvName,@Barcode,@cInvStd,@BatchNo,'','',
@PositionsOutCode,@PositionsOutName,@cComUnitName,@cComQuantity,@cComUnitPrice,@mComUnitName,@mComQuantity,
@CheckID,@CheckName,'',@FlowNo,@CanUse,'由调拨单产生的出库单'
IF(@rtn<>1)
BEGIN
SET @RETURNCODE=-4
SET @RETURNMSG='生成其它出库单明细信息失败!'
GOTO ERROR
END
FETCH NEXT FROM CUR_TransVouchers
INTO @cInvCode,@cInvName,@Barcode,@cInvStd,@BatchNo,@PositionsInCode,@PositionsInName,
@cComUnitName,@cComQuantity,@cComUnitPrice,@mComUnitName,@mComQuantity
END
--修改调拨单审核标志
UPDATE WMS_TransVoucher
SET CheckID=@CheckID,CheckName=@CheckName,CheckTime=@BusinessDate
WHERE FlowNo=@FlowNo AND ISNULL(CheckID,'')=''
IF(@@ERROR<>0)
BEGIN
SET @RETURNCODE=-5
SET @RETURNMSG='修改调拨单审核标志失败!'
GOTO ERROR
END
COMMIT TRANSACTION
SELECT 1,'调拨单审核成功!'
RETURN 1
ERROR:
BEGIN
--返回-3表示带有指定名称的游标变量并不存在,或者即使存在这样一个游标变量,但并没有给它分配游标。
IF(CURSOR_STATUS('local','CUR_TransVouchers')<>-3)
BEGIN
IF(CURSOR_STATUS('local','CUR_TransVouchers')<>-1) --返回-1表示分配给该变量的游标被关闭
BEGIN
CLOSE CUR_TransVouchers
DEALLOCATE CUR_TransVouchers
END
END
IF(@@TRANCOUNT>0)
BEGIN
ROLLBACK TRANSACTION
SELECT @RETURNCODE,@RETURNMSG
RETURN -1
END
END
END
END
-- Add the parameters for the stored procedure here
@FlowNo varchar(50), --单据编号
@CheckID varchar(50), --审核人ID
@CheckName varchar(50), --审核人姓名
@SystemID int --系统标识
AS
BEGIN
-- Insert statements for procedure here
BEGIN TRANSACTION
DECLARE @rtn INT
DECLARE @BusinessDate DATETIME
DECLARE @FlowNoIn VARCHAR(50)
DECLARE @FlowNoOut VARCHAR(50)
DECLARE @cWhCodeIn VARCHAR(50)
DECLARE @cWhNameIn VARCHAR(50)
DECLARE @CanUse VARCHAR(50)
DECLARE @cWhCodeOut VARCHAR(50)
DECLARE @cWhNameOut VARCHAR(50)
DECLARE @cInvCode VARCHAR(50)
DECLARE @cInvName VARCHAR(50)
DECLARE @Barcode VARCHAR(50)
DECLARE @cInvStd VARCHAR(50)
DECLARE @BatchNo VARCHAR(50)
DECLARE @PositionsInCode VARCHAR(50)
DECLARE @PositionsInName VARCHAR(50)
DECLARE @PositionsOutCode VARCHAR(50)
DECLARE @PositionsOutName VARCHAR(50)
DECLARE @cComUnitName VARCHAR(50)
DECLARE @cComQuantity FLOAT
DECLARE @cComUnitPrice MONEY
DECLARE @mComUnitName VARCHAR(50)
DECLARE @mComQuantity FLOAT
DECLARE @RETURNCODE INT
DECLARE @RETURNMSG VARCHAR(100)
SET @BusinessDate=GETDATE()
SELECT @cWhCodeIn=cWhCodeIn,
@cWhNameIn=cWhNameIn,
@cWhCodeOut=cWhCodeOut,
@cWhNameOut=cWhNameOut,
@CanUse=CanUse
FROM WMS_TransVoucher
WHERE FlowNo=@FlowNo AND ISNULL(CheckID,'')=''
IF(@@ROWCOUNT>0)
BEGIN
--增加一张调拨入库单
EXEC WMS_GetFormNo '其它入库',@BusinessDate,@FlowNoIn output
EXEC @rtn=dbo.WMS_StockRecord_Add
@FlowNoIn,1,'103001','',@BusinessDate,@cWhCodeIn,@cWhNameIn,
'','','','','','','',@CheckID,@CheckName,@CanUse,'',@FlowNo,'','','',@SystemID,'由调拨单产生的入库单'
IF(@rtn<>1)
BEGIN
SET @RETURNCODE=-1
SET @RETURNMSG='生成其它入库单单头信息失败!'
GOTO ERROR
END
--增加一张调拨出库单
EXEC WMS_GetFormNo '其它出库',@BusinessDate,@FlowNoOut output
EXEC @rtn=dbo.WMS_StockRecord_Add
@FlowNoOut,1,'203001','',@BusinessDate,@cWhCodeOut,@cWhNameOut,
'','','','','','','',@CheckID,@CheckName,@CanUse,'',@FlowNo,'','','',@SystemID,'由调拨单产生的出库单'
IF(@rtn<>1)
BEGIN
SET @RETURNCODE=-2
SET @RETURNMSG='生成其它出库单单头信息失败!'
GOTO ERROR
END
--增加调拨单明细
DECLARE CUR_TransVouchers CURSOR FOR
SELECT cInvCode,cInvName,Barcode,cInvStd,BatchNo,PositionsInCode,PositionsInName,
cComUnitName,cComQuantity,cComUnitPrice,mComUnitName,mComQuantity
FROM WMS_TransVouchers
WHERE FlowNo=@FlowNo
OPEN CUR_TransVouchers
FETCH NEXT FROM CUR_TransVouchers
INTO @cInvCode,@cInvName,@Barcode,@cInvStd,@BatchNo,@PositionsInCode,@PositionsInName,
@cComUnitName,@cComQuantity,@cComUnitPrice,@mComUnitName,@mComQuantity
WHILE(@@FETCH_STATUS=0)
BEGIN
print @cInvCode+','+@cInvName
EXEC @rtn=dbo.WMS_StockRecords_Add
@FlowNoIn,@cInvCode,@cInvName,@Barcode,@cInvStd,@BatchNo,'','',
@PositionsInCode,@PositionsInName,@cComUnitName,@cComQuantity,@cComUnitPrice,@mComUnitName,@mComQuantity,
@CheckID,@CheckName,'',@FlowNo,@CanUse,'由调拨单产生的入库单'
IF(@rtn<>1)
BEGIN
SET @RETURNCODE=-3
SET @RETURNMSG='生成其它入库单明细信息失败!'
GOTO ERROR
END
EXEC @rtn=dbo.WMS_StockRecords_Add
@FlowNoOut,@cInvCode,@cInvName,@Barcode,@cInvStd,@BatchNo,'','',
@PositionsOutCode,@PositionsOutName,@cComUnitName,@cComQuantity,@cComUnitPrice,@mComUnitName,@mComQuantity,
@CheckID,@CheckName,'',@FlowNo,@CanUse,'由调拨单产生的出库单'
IF(@rtn<>1)
BEGIN
SET @RETURNCODE=-4
SET @RETURNMSG='生成其它出库单明细信息失败!'
GOTO ERROR
END
FETCH NEXT FROM CUR_TransVouchers
INTO @cInvCode,@cInvName,@Barcode,@cInvStd,@BatchNo,@PositionsInCode,@PositionsInName,
@cComUnitName,@cComQuantity,@cComUnitPrice,@mComUnitName,@mComQuantity
END
--修改调拨单审核标志
UPDATE WMS_TransVoucher
SET CheckID=@CheckID,CheckName=@CheckName,CheckTime=@BusinessDate
WHERE FlowNo=@FlowNo AND ISNULL(CheckID,'')=''
IF(@@ERROR<>0)
BEGIN
SET @RETURNCODE=-5
SET @RETURNMSG='修改调拨单审核标志失败!'
GOTO ERROR
END
COMMIT TRANSACTION
SELECT 1,'调拨单审核成功!'
RETURN 1
ERROR:
BEGIN
--返回-3表示带有指定名称的游标变量并不存在,或者即使存在这样一个游标变量,但并没有给它分配游标。
IF(CURSOR_STATUS('local','CUR_TransVouchers')<>-3)
BEGIN
IF(CURSOR_STATUS('local','CUR_TransVouchers')<>-1) --返回-1表示分配给该变量的游标被关闭
BEGIN
CLOSE CUR_TransVouchers
DEALLOCATE CUR_TransVouchers
END
END
IF(@@TRANCOUNT>0)
BEGIN
ROLLBACK TRANSACTION
SELECT @RETURNCODE,@RETURNMSG
RETURN -1
END
END
END
END
作者: wonderfulfeige 发布时间: 2011-11-29
用 @@TRANCOUNT 可以获得打开的事务数.
作者: qianjin036a 发布时间: 2011-11-29
用 CURSOR_STATUS( )函数可以检测指定的游标是否打开.
作者: qianjin036a 发布时间: 2011-11-29
我最后就是用这两个判断的,可是用用 CURSOR_STATUS( )函数是否等于-1来判断游标是否关闭,失败了
作者: wonderfulfeige 发布时间: 2011-11-29
每次还是提示游标已经存在了
作者: wonderfulfeige 发布时间: 2011-11-29
如果你用的是2008,可以跟踪一下.
作者: qianjin036a 发布时间: 2011-11-29
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28