求来个大佬看一下吧,实在不会了

qq_30412191 2020-08-04 01:48:13
BEGIN 


SET @P_APPLY_NO = '';
SET @P_OUT_MSG = '';
--1、@P_COMPANY_CODE(归属企业十位代码)+@P_RELATION_COMPANY_CODE(关系企业十位代码)+@P_FILE_TYPE查询单证类型,判断其是否存在
--1.1 如果不存在,直接RETURN,不用报错,对方可能文件比我们多,如果我们没有配置,表示我们不需要,不需要的文件,我们不报错,不处理就好。
IF NOT EXISTS(
SELECT 1 FROM dbo.DAM_BGD_FILE_TYPE WHERE COMPANY_CODE=@P_COMPANY_CODE AND RELATION_COMPANY_CODE=@P_RELATION_COMPANY_CODE
AND PAGE_TYPE='FILE_TYPE'
AND TYPE=@P_FILE_TYPE
)
BEGIN
RETURN ;
END
--2、@P_COMPANY_CODE(归属企业十位代码)+@P_RELATION_COMPANY_CODE(关系企业十位代码)+@P_FILE_TYPE查询命名规则,判断其是否存在
--2.1 如果存在,记录好 前缀、后缀、连接符,供后面使用。
--2.2 如果不存在,报错退出。
IF NOT EXISTS(
SELECT 1 FROM dbo.DAM_BGD_FILE_TYPE WHERE COMPANY_CODE=@P_COMPANY_CODE AND RELATION_COMPANY_CODE=@P_RELATION_COMPANY_CODE
AND PAGE_TYPE='FILE_NAME'
AND TYPE=@P_FILE_TYPE
)
BEGIN
SET @P_OUT_MSG='不存在命名规则';
RETURN
END

BEGIN TRY
BEGIN TRAN TRANS

SELECT @V_APPLY_NO=APPLY_NO,@V_HEAD_GUID=GUID FROM dbo.DAM_BGD_INFO
WHERE COMPANY_CODE=@P_COMPANY_CODE
AND RELATION_COMPANY_CODE=@P_RELATION_COMPANY_CODE
AND ENTRY_ID=@P_ENTRY_ID
IF ISNULL(@V_HEAD_GUID,'') = '' ---说明没有数据,新增表头
BEGIN
EXEC dbo.PRO_DAM_BGH_INSERT_WDGL_HEAD @P_COMPANY_CODE = @P_COMPANY_CODE, -- varchar(20)
@P_I_E = @P_I_E, -- varchar(5)
@P_M_P = @P_M_P, -- varchar(5)
@P_D_DATE = @P_D_DATE, -- varchar(100)
@P_BOND_INVT_NO =@P_BOND_INVT_NO, -- varchar(50)
@P_ENTRY_ID = @P_ENTRY_ID, -- varchar(18)
@P_DEFAULT_BIZ_TYPE = @P_DEFAULT_BIZ_TYPE, -- varchar(50)
@P_CONTROL_NO =@P_CONTROL_NO, -- varchar(255)
@P_CONTRACT_NO =@P_CONTRACT_NO, -- varchar(255)
@P_RELATION_COMPANY_CODE = @P_RELATION_COMPANY_CODE, -- varchar(36)
@P_DCLCUS_FLAG = '', -- varchar(1)
@P_DCLCUS_TYPECD = '', -- varchar(25)
@P_USER_NO = '', -- varchar(50)
@P_APPLY_NO = @P_APPLY_NO OUTPUT, -- varchar(50)
@P_OUT_MSG = @P_OUT_MSG OUTPUT, -- varchar(500)
@P_OUT_LOG = @P_OUT_LOG OUTPUT -- varchar(1000)
IF ISNULL(@P_APPLY_NO,'')=''
BEGIN
RAISERROR ('Error raised in TRY block.', -- Message text.
16, -- Severity.
1 -- State.
);
END
END


IF ISNULL(@P_DEFAULT_BIZ_TYPE,'')=''
BEGIN
SET @P_DEFAULT_BIZ_TYPE='ENTRY_ID';
END
EXECUTE dbo.PRO_DAM_INSERT_WDGL_DETAIL @P_APPLY_NO = @P_APPLY_NO, -- varchar(50)
@P_FILE_TYPE = @P_FILE_TYPE, -- varchar(20)
@P_FILE_PATH = @P_FILE_PATH, -- varchar(255)
@P_FILE_EXT = @P_FILE_EXT, -- varchar(10)
@P_BIZ_TYPE = @P_DEFAULT_BIZ_TYPE, -- varchar(36) ---默认关联单类型
@P_FILE_SOURCE = '', -- varchar(50)
@P_FILE_SIZE = @P_FILE_SIZE, -- float
@P_FILE_NO = '', -- varchar(50)
@P_OUT_FILE_PATH=@P_WDGL_FILE_PATH OUTPUT,
@P_OUT_MSG = @P_OUT_MSG OUTPUT -- varchar(500)
IF ISNULL(@P_OUT_MSG,'')<>''
BEGIN

RAISERROR ('Error raised in TRY block.', -- Message text.
16, -- Severity.
1 -- State.
);
END

EXECUTE dbo.PRO_DAM_BGY_CHECK_AND_INSERT_SEND_TASK
@P_APPLY_NO=@P_APPLY_NO,
@P_OUT_MSG = @P_OUT_MSG OUTPUT -- varchar(500)

END TRY
BEGIN CATCH
IF ISNULL(@P_OUT_MSG,'')=''
BEGIN
---说明没有错误--
COMMIT TRANSACTION TRANS
END
ELSE
BEGIN
---///-----------
ROLLBACK TRANSACTION TRANS
END
END CATCH;
END
具体报错消息 6401,级别 16,状态 1,过程 PRO_DAM_BGY_WDGL_BODY,第 152 行
无法回滚 TRANS。找不到该名称的事务或保存点。
消息 266,级别 16,状态 2,过程 PRO_DAM_BGY_WDGL_BODY,第 0 行
EXECUTE 后的事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配。上一计数 = 4,当前计数 = 5。

--------我有两个表的新增分别是两个存储,里面分别有基本的check逻辑,我又写了PRO_DAM_BGY_WDGL_BODY,对两张表新增,
希望通过事务的方式保持一致性,结果报错,有人能提供下具体思路吗
...全文
109 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
RINK_1 2020-08-04
  • 打赏
  • 举报
回复
引用 5 楼 qq_30412191 的回复:
[quote=引用 4 楼 RINK_1 的回复:][quote=引用 1 楼 datafansbj 的回复:]每一个 Begin tran 必须且唯一有一个 commit tran 或 rollback tran 向匹配。 你的代码貌似有逻辑错误:raiserror 如果没有被执行到,或执行过程没有任何错误发生,就不会执行到 catch 里面,这样一来就只有 begin tran,无 commit 或 rollback 与其匹配。
引用 2 楼 RINK_1 的回复:
COMMIT TRAN TRANS应该在END TRY之前
说错了,应该是每个IF里面都有COMMIT或者ROLLBACK[/quote],为什么呀,if里面我执行的是存储啊,我会返回一个@P_OUT_MSG,如果有值,那就回滚,为了实现这个目的我还要手动一个异常,有什么更好的解决办法没有?[/quote] https://blog.csdn.net/shujudeliu/article/details/78783613,你看看这个,和你的问题类似。
datafansbj 2020-08-04
  • 打赏
  • 举报
回复
在程序语句中,出了异常会立即转到异常代码处理模块,未执行的语句不再执行。开发时不建议人为生成异常(系统对异常处理要付出代价,会占用一些资源),如果执行不符合预期,应返回相应的结果告知调用者。

要回滚很简单,rollback 即可,只是要注意 rollback 只能回滚当前层次的 transaction,不能回滚到最原始点。一般执行到 rollback 就该 return 了。

为什么要人为制造异常?难道仅仅是为了能进到 catch 块里?这个理由太牵强了。
qq_30412191 2020-08-04
  • 打赏
  • 举报
回复
引用 4 楼 RINK_1 的回复:
[quote=引用 1 楼 datafansbj 的回复:]每一个 Begin tran 必须且唯一有一个 commit tran 或 rollback tran 向匹配。 你的代码貌似有逻辑错误:raiserror 如果没有被执行到,或执行过程没有任何错误发生,就不会执行到 catch 里面,这样一来就只有 begin tran,无 commit 或 rollback 与其匹配。
引用 2 楼 RINK_1 的回复:
COMMIT TRAN TRANS应该在END TRY之前
说错了,应该是每个IF里面都有COMMIT或者ROLLBACK[/quote],为什么呀,if里面我执行的是存储啊,我会返回一个@P_OUT_MSG,如果有值,那就回滚,为了实现这个目的我还要手动一个异常,有什么更好的解决办法没有?
RINK_1 2020-08-04
  • 打赏
  • 举报
回复
引用 1 楼 datafansbj 的回复:
每一个 Begin tran 必须且唯一有一个 commit tran 或 rollback tran 向匹配。 你的代码貌似有逻辑错误:raiserror 如果没有被执行到,或执行过程没有任何错误发生,就不会执行到 catch 里面,这样一来就只有 begin tran,无 commit 或 rollback 与其匹配。
引用 2 楼 RINK_1 的回复:
COMMIT TRAN TRANS应该在END TRY之前
说错了,应该是每个IF里面都有COMMIT或者ROLLBACK
qq_30412191 2020-08-04
  • 打赏
  • 举报
回复
引用 1 楼 datafansbj 的回复:
每一个 Begin tran 必须且唯一有一个 commit tran 或 rollback tran 向匹配。 你的代码貌似有逻辑错误:raiserror 如果没有被执行到,或执行过程没有任何错误发生,就不会执行到 catch 里面,这样一来就只有 begin tran,无 commit 或 rollback 与其匹配。
引用 2 楼 RINK_1 的回复:
COMMIT TRAN TRANS应该在END TRY之前
, 感谢两位大神,谢谢,我在前面加了个commit tran trans 就好了谢谢
RINK_1 2020-08-04
  • 打赏
  • 举报
回复
COMMIT TRAN TRANS应该在END TRY之前
datafansbj 2020-08-04
  • 打赏
  • 举报
回复
每一个 Begin tran 必须且唯一有一个 commit tran 或 rollback tran 向匹配。
你的代码貌似有逻辑错误:raiserror 如果没有被执行到,或执行过程没有任何错误发生,就不会执行到 catch 里面,这样一来就只有 begin tran,无 commit 或 rollback 与其匹配。

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧