+ -
当前位置:首页 → 问答吧 → 如何判断已打开的事务没有rollback或者commit,已打开的游标是否关闭。我下面这样写,如果第一次运行有错误发生,则第二次运行时总是提示游标已存在。

如何判断已打开的事务没有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

作者: 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

热门下载

更多