oracle存储过程对异常的处理_sqlserver创建存储过程

oracle存储过程对异常的处理_sqlserver创建存储过程在编写SQL Server 事务相关的存储过程代码时,经常看到下面这样的写法: begin tran update statement 1 … update statement 2 … de…

在编写SQL Server 事务相关的存储过程代码时,经常看到下面这样的写法:

begin tran
update statement 1 ...
update statement 2 ...
delete statement 3 ...
insert statement 4 ...
commit tran

代码100分

这样编写的SQL存在很大隐患。请看下面的例子:

代码100分create table demo(id int not null)
go
begin tran
insert into demo values (null)
insert into demo values (2)
commit tran
go

执行时会出现一个违反not null 约束的错误信息,但随后又提示(1 row(s) affected)。 我们执行select * from demo 后发现insert into demo values(2) 却执行成功了。 这是什么原因呢? 
原来 SQL Server在发生runtime 错误时,默认会rollback引起错误的语句,而继续执行后续语句。
如何避免这样的问题呢?有三种方法:
1. 在事务语句最前面加上set xact_abort on

set xact_abort on
begin tran
update statement 1 ...
update statement 2 ...
delete statement 3 ...
commit tran
go

当xact_abort 选项为on 时,SQL Server在遇到错误时会终止执行并rollback 整个事务。
2. 在每个单独的DML语句执行后,立即判断执行状态,并做相应处理。

代码100分begin tran
update statement 1 ...
if @@error <> 0
begin rollback tran
goto labend
end
delete statement 2 ...
if @@error <> 0
begin rollback tran
goto labend
end
commit tran
labend:
go

3. 在SQL Server 2005中,可利用 try…catch 异常处理机制。

begin tran
begin try
update statement 1 ...
delete statement 2 ...
endtry
begin catch
if @@trancount > 0
rollback tran
end catch
if @@trancount > 0
commit tran
go

 

下面是个简单的存储过程,演示事务处理过程。

create procedure dbo.pr_tran_inproc as begin set nocount on
begin tran
update statement 1 ...
if @@error <> 0
begin rollback tran
return -1 end
delete statement 2 ...
if @@error <> 0
begin rollback tran
return -1
end commit tran
return 0
end
go

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/10912.html

(0)
上一篇 2022-12-19
下一篇 2022-12-19

相关推荐

  • mysql 全局查询日志[通俗易懂]

    mysql 全局查询日志[通俗易懂]正式生产环境下不要开启 一.配置启用 永久: 在mysql的my.cnf中设置: [mysqld] #开启 general_log=1 #记录日志文件的路径 general_log_file=/pa…

    2023-02-27
    132
  • redis scan命令遍历数据_scan redis

    redis scan命令遍历数据_scan redis1. 获取指定前缀的key 需求描述: Redis中有大量以xxx开头的key,在不使用keys命令的情况下,如何快速获取这些前缀的key 解决方案: redis自带的scan命令可以解决这个问题 2

    2023-05-29
    124
  • 使用Python的Iterrows方法处理数据

    使用Python的Iterrows方法处理数据在数据科学领域,数据的处理和分析是必不可少的。Python有着强大的数据处理能力,其中Iterrows方法是其中一项重要的工具。Iterrows方法提供了一种遍历pandas DataFrame行的方法。在本文中,我们将详细介绍Iterrows方法的用法和优点,探讨如何在数据处理中应用Iterrows方法。

    2024-05-09
    47
  • python将c,python将成绩从大到小排序「终于解决」

    python将c,python将成绩从大到小排序「终于解决」要搞明白如何让python调用C/C++代码(也就是写python的extension),你需要征服手册中的Extending embedding厚厚的一章。在昨天花了一个小时看地头晕脑胀,仍然不知道如何写python的extension后,查阅了一些其他书籍,最终在Python Programming On Win32书中找到了教程。

    2023-08-24
    104
  • Python编程技巧:合并多个List

    Python编程技巧:合并多个List在Python编程中,合并多个List是一个非常常见的操作。将多个List合并为一个List可以很方便地进行数据处理,减少代码量,并提高程序的效率。在这篇文章中,我们将介绍多种方法来合并多个List。

    2024-07-14
    31
  • 如何搭建数据库自动化运维体系框架_大数据平台搭建与运维

    如何搭建数据库自动化运维体系框架_大数据平台搭建与运维
    需求背景: 随着业务的增长、对运维效率和质量的要求不断提高,对自动化运维体系的需求也不断增强。 目前笔者服务的很多中大型企业客户,运维其实还停留在“刀耕火种…

    2023-04-06
    147
  • python错误类型error(python错误类型 编译错误)

    python错误类型error(python错误类型 编译错误)python常见的错误有

    2023-11-24
    85
  • MongoDB索引(7)

    MongoDB索引(7)索引是对数据库表中一列或多列的值进行排序的一种结构,可以让我们查询数据库变得 更快。MongoDB 的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的查询优化技巧。 增加检索的效率. mo

    2023-03-27
    131

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注