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 实例代码的更多相关文章

  1. 基础知识《十》java 异常捕捉 ( try catch finally ) 你真的掌握了吗?

    本文转载自  java 异常捕捉 ( try catch finally ) 你真的掌握了吗? 前言:java 中的异常处理机制你真的理解了吗?掌握了吗?catch 体里遇到 return 是怎么处理 ...

  2. 异常捕捉 ( try catch finally ) 你真的掌握了吗?

    前言:java 中的异常处理机制你真的理解了吗?掌握了吗?catch 体里遇到 return 是怎么处理? finally 体遇到 return 怎么办?finally 体里有 System.exit ...

  3. java 异常捕捉 ( try catch finally ) 你真的掌握了吗?

    掌握下面几条原则就可以完全解决“当try.catch.finally遭遇return”的问题. 原则:1.finally语句块中的代码是一定会执行的,而catch块中的代码只有发生异常时才会执行. 2 ...

  4. Oracle存储过程中异常Exception的捕捉和处理

    Oracle存储过程中异常的捕捉和处理 CREATE OR REPLACE Procedure Proc_error_process ( v_IN in Varchar2, v_OUT Out Var ...

  5. SQL Server Try Catch 异常捕捉

    SQL Server Try Catch 异常捕捉 背景 今天遇到一个关于try catch 使用比较有意思的问题.如下一段代码: SELECT @@TRANCOUNT AS A BEGIN TRY ...

  6. BootStrap fileinput.js文件上传组件实例代码

    1.首先我们下载好fileinput插件引入插件 ? 1 2 3 <span style="font-size:14px;"><link type="t ...

  7. 【C++】 C++异常捕捉和处理

    在阅读别人开发的项目中,也许你会经常看到了多处使用异常的代码,也许你也很少遇见使用异常处理的代码.那在什么时候该使用异常,又在什么时候不该使用异常呢?在学习完异常基本概念和语法之后,后面会有讲解. ( ...

  8. Java多线程——<七>多线程的异常捕捉

    一.概述 为什么要单独讲多线程的异常捕捉呢?先看个例子: public class ThreadException implements Runnable{ @Override public void ...

  9. JQuery 获取json数据$.getJSON方法的实例代码

    这篇文章介绍了JQuery 获取json数据$.getJSON方法的实例代码,有需要的朋友可以参考一下 前台: function SelectProject() { var a = new Array ...

随机推荐

  1. JavaScript跳出iframe框架

    一.window.top top属性返回最顶层的先辈窗口. 该属性返回对一个顶级窗口的只读引用.如果窗口本身就是一个顶级窗口,top属性存放对窗口自身的引用.如果窗口是一个框架,那么top属性引用包含 ...

  2. struts2+Oracle实现管理员查看用户提交的意见功能

    说一下需求:这个功能类似于邮件功能,当用户在站点中提交一些建议及意见后.后台将其存入到Oracle数据库中.然后管理员登录站点,会看到还没有读过以及读过的意见及建议,并能够将未读过的意见及建议标记为已 ...

  3. Ubuntu14.04下Nginx反向代理Odoo域名

    安装nginx sudo apt-get install -y nginx 修改配置文件 vi /etc/nginx/nginx.conf #注释掉下面这行代码 #include /etc/nginx ...

  4. LATEX教程(二)

    插入图片 \documentclass{article} \usepackage{graphicx} \usepackage{Ctex} \title{插入图片} \author{yif} \begi ...

  5. 【转】api网关

    微服务之API网关 一.引言 随着互联网的快速发展,当前以步入移动互联.物联网时代.用户访问系统入口也变得多种方式,由原来单一的PC客户端,变化到PC客户端.各种浏览器.手机移动端及智能终端等.同时系 ...

  6. BAPI_ACC_DOCUMENT_POST 解决原因代码输入问题-利用BADI

    (1)    复制函数SAMPLE_INTERFACE_RWBAPI01为Z SAMPLE_INTERFACE_RWBAPI01 *"---------------------------- ...

  7. 软件磁盘阵列(RAID)

    RAID软件磁盘阵列 RAID 即廉价磁盘冗余阵列,其高可用性和可靠性适用于大规模环境中,相比正常使用,数据更需要被保护.RAID 是将多个磁盘整合的大磁盘,不仅具有存储功能,同时还有数据保护功能. ...

  8. 【转】web.xml中load-on-startup的作用

    http://www.blogjava.net/xzclog/archive/2011/09/29/359789.html 如下一段配置,熟悉DWR的再熟悉不过了:<servlet>   ...

  9. Python 1 数据类型的操作

    一.数字(Number) 1.数学函数: 函数 返回值 ( 描述 ) abs(x) 返回数字的绝对值,如abs(-10) 返回 10 ceil(x) 返回数字的上入整数,如math.ceil(4.1) ...

  10. centos6 没有eth0网络

    编辑 /etc/sysconfig/network-scripts/ifcfg-eth0 ONREBOOT=no #改成yes service network restart 在用 ifconfig ...