java调用存储过程

  在做java调用sqlserver存储过程时遇到了各种各样的问题,不过在不懈的努力之下这些问题还是得以解决了。今天总结一下遇到的问题以及解决的方法。

  首先调用存储过程的方法大家都很清楚:

String sql="{call dbo.proc_getdata(?)}";//存储过程名以及参数,?为参数占位符。

CallableStatement cstmt=connection.prepareCall(sql);

cstmt.setInt(1, 1);



ResultSet rs=cstmt.executeQuery();//返回结果集

    while(rs.next()){

          

    }

  如果这里的dbo.proc_getdata存储过程没有用到临时表或是表变量,获得想要的结果集没有任何问题。但是存储过程里如果用到了临时表或者是表变量,

那么结果就有点出乎预料了。rs总是没有返回值。这是为什么呢?虽然直接也没有找到原因,但是找到了解决的办法。

     首先在存储过程的开始和结尾分别加上set nocount on和set nocount off。然后用到临时表的地方使用自动执行sql语句的方式:

if (object_id('dbo.proc_getdata', 'P') is not null)

    drop proc dbo.proc_getdata

go

create proc dbo.proc_getdata (

    @No int --输入参数

)

as

begin

    set nocount on

    

    IF EXISTS(SELECT * FROM TEMPDB..SYSOBJECTS WHERE ID = OBJECT_ID('TEMPDB..#Student')) 

    DROP TABLE #Student --临时表

    create TABLE #Student   (

    NOCD int NOT NULL ,

    Name nvarchar(32) NOT NULL ,

    PRIMARY KEY(NOCD)

    )

    

    declare @sql1 VARCHAR(8000)

     set @sql1=' '

     set @sql1='

      insert into #Student

      select * from students'

     exec(@sql1)

     set nocount off            

end

 

你可能感兴趣的:(java)