存储过程,游标,异常捕捉 try catch 实例代码
1.存储过程代码。 (数据库是 AdventureWorks)
存储过程用来将错误信息插入到指定的表中。
在别的地方可以调用存储过程插入错误信息(下面部分代码 生成一个表,如果表已经存在就会插入错误信息到表中)
知识点: try catch,output参数;begin try..end try;begin catch….end catch;
--存储过程output, begin try,begin catch
--声明一个存储过程 uspLogErrorTest 模仿 uspLogError.用来记录发生错误的信息,并将错误信息
--放入到 select * from [dbo].[ErrorLog]
create proc dbo.uspLogErrorTest
@ErrorLogID [int]=0 output
AS
BEGIN
set nocount on
--输出参数
set @ErrorLogID=0;
Begin Try
if error_number() is null --捕捉错误号,有就激活catch
return;
--当前请求具有活动的用户事务,但出现了致使事务被归类为无法提交的事务的错误。
--请求无法提交事务或回滚到保存点;它只能请求完全回滚事务。请求在回滚事务之前无法执行任何写操作。请求在回滚事务之前只能执行读操作。事务回滚之后,请求便可执行读写操作并可开始新的事务。
if xact_state()=-1
begin
print 'Cannot log error since the current transaction is in an uncommittable state'
+' Rollback the transaction before executing uspLogError2 in order to successfully log error information'
return;
end
insert [dbo].[ErrorLog]
(
[UserName],
[ErrorNumber],
[ErrorSeverity],
[ErrorState],
[ErrorProcedure],
[ErrorLine],
[ErrorMessage]
)
values
(
convert(sysname,current_user),
error_number(),
error_severity(),
error_state(),
error_procedure(),
error_line(),
error_message()
);
--得到刚才插入的行号
set @ErrorLogID=@@IDENTITY;
end try
begin catch
print 'an error occurred in stored procedure uspLogError : '
exec [dbo].[uspprinterror];
return -1;
end catch
end
--select * from [dbo].[ErrorLog]
--上面声明存储过程
--下面调用存储过程,创建表,如果已经存在就会写入表 [dbo].[ErrorLog]
use AdventureWorks
go
begin try
create table OurIFTest(
coll int primary key
)
end try
begin catch
--something wrong
declare @MyOutputParameter int;
if error_number()=2714 --object 存在的错误
begin
print 'waring: skipping CREATE AS table 已经存在'
--执行刚才的存储过程
exec dbo.uspLogError @ErrorLogID=@MyOutputParameter output; --执行,插入error表
print '发生一个错误。错误id'+cast(@MyOutputParameter as nvarchar);
end
else
raiserror('something not good happend this time around',16,1)
end catch
2.游标代码
本代码声明游标为global变量,在存储过程声明了游标,打开游标,但是唯独没close(关闭游标) 和 deallocate(清除游标分配到的内存)
游标各中关键字使用 gloal/local; static/dynmic/keyset/fast_forward
static:不能感知原始表中数据的变化;存放在tempdb中
dynmic:能感知;但是占用大量性能
keyset:原始表必须有唯一索引,关键索引存在于tempdb中,能感知 删除,修改,不能感知新增的。
use AdventureWorks
go
create proc spCursorScope2
AS
declare @Counter int;
declare @OrderId int;
declare @CustomerId int
declare CursorTest cursor
Global--默认,即使不填。 Glbal/local
--<static,dynamic,keySet,Fast_forward>
For
select SalesOrderId,CustomerID
from Sales.SalesOrderHeader
select @Counter=1;
open CursorTest
fetch next from CursorTest into @OrderId,@CustomerId
print 'Row '+cast(@Counter as nvarchar)+' has a SalesOrderId of '+convert(nvarchar,@OrderId)+' and a CustomerId of '+cast(@CustomerId as nvarchar)
while(@@FETCH_STATUS=0) AND (@Counter<5)
begin
select @Counter=@Counter+1;
fetch next from CursorTest into @OrderId,@CustomerId
print 'Row '+cast(@Counter as nvarchar)+' has a SalesOrderId of '+convert(nvarchar,@OrderId)+' and a CustomerId of '+cast(@CustomerId as nvarchar)
end
--上面的存储过程没有 close cursor ,和销毁 deallocate cursor
exec spCursorScope2
--重新声明几个变量,因为上面只有游标变量CursorTest 是全局的,其他的在存储过程外都要重新声明
--一旦执行存储过程,则游标就执行了,而且没关闭之前一直在内存中。则存储过程后面的语句可以继续使用上面的游标
exec spCursorScope
declare @OrderId int
declare @CustomerId int
declare @Counter int
set @Counter=6
while (@@FETCH_STATUS=0) AND (@Counter<=10)
begin
fetch next from CursorTest into @OrderId,@CustomerId
print 'Row '+cast(@Counter as nvarchar)+' has a SalesOrderId of '+convert(nvarchar,@OrderId)+' and a CustomerId of '+cast(@CustomerId as nvarchar)
set @Counter=@Counter+1
end
close CursorTest
deallocate CursorTest 3.事务 (tran) Begin tran mytran; (名字可无)
commit tran xx;
rollback tran xx;
save tran xx; //将此出标记为回滚点。 rollback tran 回滚点名字;就会回滚到回滚点和回滚方法之间,其他地方不会回滚的。 例: Begin tran mytran;
declare @i int
set @i=0 insert into students (name,sex) values ('小明',0)
save tran xiaoming;
insert into students (name,sex) values ('小龙',0)
save tran xiaolong; rollback xiaoming; //回滚到xiaoming 回滚点 commit tran mytran; //此时数据库里只有小明,没有小龙的数据。
存储过程,游标,异常捕捉 try catch 实例代码的更多相关文章
- 基础知识《十》java 异常捕捉 ( try catch finally ) 你真的掌握了吗?
本文转载自 java 异常捕捉 ( try catch finally ) 你真的掌握了吗? 前言:java 中的异常处理机制你真的理解了吗?掌握了吗?catch 体里遇到 return 是怎么处理 ...
- 异常捕捉 ( try catch finally ) 你真的掌握了吗?
前言:java 中的异常处理机制你真的理解了吗?掌握了吗?catch 体里遇到 return 是怎么处理? finally 体遇到 return 怎么办?finally 体里有 System.exit ...
- java 异常捕捉 ( try catch finally ) 你真的掌握了吗?
掌握下面几条原则就可以完全解决“当try.catch.finally遭遇return”的问题. 原则:1.finally语句块中的代码是一定会执行的,而catch块中的代码只有发生异常时才会执行. 2 ...
- Oracle存储过程中异常Exception的捕捉和处理
Oracle存储过程中异常的捕捉和处理 CREATE OR REPLACE Procedure Proc_error_process ( v_IN in Varchar2, v_OUT Out Var ...
- SQL Server Try Catch 异常捕捉
SQL Server Try Catch 异常捕捉 背景 今天遇到一个关于try catch 使用比较有意思的问题.如下一段代码: SELECT @@TRANCOUNT AS A BEGIN TRY ...
- BootStrap fileinput.js文件上传组件实例代码
1.首先我们下载好fileinput插件引入插件 ? 1 2 3 <span style="font-size:14px;"><link type="t ...
- 【C++】 C++异常捕捉和处理
在阅读别人开发的项目中,也许你会经常看到了多处使用异常的代码,也许你也很少遇见使用异常处理的代码.那在什么时候该使用异常,又在什么时候不该使用异常呢?在学习完异常基本概念和语法之后,后面会有讲解. ( ...
- Java多线程——<七>多线程的异常捕捉
一.概述 为什么要单独讲多线程的异常捕捉呢?先看个例子: public class ThreadException implements Runnable{ @Override public void ...
- JQuery 获取json数据$.getJSON方法的实例代码
这篇文章介绍了JQuery 获取json数据$.getJSON方法的实例代码,有需要的朋友可以参考一下 前台: function SelectProject() { var a = new Array ...
随机推荐
- 【转】NAS、DAS和SAN存储的特点及主要区别
接触过存储设备的朋友应该对NAS.DAS和SAN存储不陌生,作为目前三种常见的存储方式,被广泛应用于企业存储设备中,那么NAS.DAS和SAN这三种存储分别有什么特点,又有何区别呢? 一.NAS存储特 ...
- cxGrid时间格式与导出Excel
引用cxFormats单元: ShortDateFormat := 'dd/mm/yyyy'; DateSeparator := '/'; cxFormatController.UseDelphiDa ...
- 实验一中的OOP思想
子类继承父类 父类中声明了接口变量 接口AB中声明了抽象方法 ab 在子类中 可以用这样通俗的语句写程序: while (!(this.termination.shouldTerminate ...
- unknown encoder libvpx
brew install ffmpeg --with-libvpx or brew reinstall ffmpeg --with-libvpx
- Spring IOC/DI和AOP原理(转发:https://www.cnblogs.com/techroad4ca/p/5770073.html)
一 IOC/DI 1. 概念及原理 IOC: Inversion of Control(控制反转)是一种设计思想,就是容器控制应用程序所需要外部资源的创建和管理,然后将其反转给应用程序.对象及其依赖对 ...
- 2015.7.8(千股跌停!做T不应当只做中色,中国软件)
2015.7.81.今天开盘所有的股票全部跌停,真是一大奇观! 今天中色股份和以往不同买卖盘为正! 但是中色的爬升比较慢,价位始终没有高过昨天的收盘价————这种情况下是否应该做T呢? 2.做T不应当 ...
- GitHub命名规则
● Added ( 新加入的需求 ) ● Fixed ( 修复 bug ) ● Changed ( 完成的任务 ) ● Updated ( 完成的任务,或者由于第三方模块变化而做的变化 )
- Kattis - convexpolygonarea 【数学】
题意 给出一系列点,求这个多边形面积 思路 向量叉积 AC代码 #include <cstdio> #include <cstring> #include <ctype. ...
- 【转】Linux磁盘文件系统类型
1. 查询命令 [root@mail ~]# df -Th 参数说明: -T 显示文件系统类型. -h:以容易理解的格式输出文件系统大小,例如124KB.345MB.46GB. 转自:https:// ...
- 02_虚拟机的安装和SecureCRT、FileZilla、Xmanage、UltraEdit工具的介绍
上述几个工具连接不成功的情况,很多时候是因为ssh服务没有安装,CentOS默认安装,不会出现问题,Ubuntu桌面版默认没有安装,需要手动安装,安装部分参考下文SecureCRT部分 一.安装Cen ...