JAVA如果调用SQLSERVER参数类型为cursor varying output

ehack 2011-12-20 10:45:34

ALTER PROCEDURE [dbo].[syspro_getfavorites]
-- Add the parameters for the stored procedure here
@iuserid varchar(40),
@ilang varchar(40),
@return cursor varying output
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
set @return =cursor forward_only static for
-- Insert statements for procedure here
select b.res_id id, b.upid pid, a.res_name name, a.res_enname, a.res_url, (case
when a.res_open = '0' then
'false'
else
'true'
end) 'open'
from syst_res_info a, syst_res_rel b, syst_res_list c, syst_factory_info d
where a.deleteflag = '0'
and a.res_state = '0'
and a.id = b.res_id
and b.res_list_id = c.id
and c.id = d.res_list_id
and c.is_base = '1';
open @return;

END

在sqlserver数据库中我用的是参数cursor varying output


CallableStatement cstmt=null;
Connection conn=getConnection();
cstmt=conn.prepareCall("call dbo.syspro_getfavorites(?,?,?)");
cstmt.setString(1,iuserid);
cstmt.setString(2,ilang);
cstmt.registerOutParameter(3,Types.OTHER);
cstmt.execute();

但在红色的cstmt.execute();的地方就报出了异常

com.microsoft.sqlserver.jdbc.SQLServerException: 操作数类型冲突: varbinary 与 cursor 不兼容


问题如题,希望大家帮我解答下!
...全文
344 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ehack 2011-12-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 qianjin036a 的回复:]
使用 cursor varying output 的目的,是为了在 MSSQL 中调用过程时,获得一个已打开的游标.
注意,这儿是指在MSSQL中处理的游标,并非你的客户端程序从服务器取得的记录集游标.
或者可以说,你的JAVA客户端,是无法处理 varying output 带出的游标的.

其实,你只要在存储过程中设置一个查询语句,你的JAVA程序调用这个存储过程后,可以获得一个记录集……
[/Quote]
我是要在存储中调用领一个过程就这样写了,还有就是我需要整个oracle、sqlserver、mysql的版本,也就是说java代码一套,通过一个标识判断链接是那个数据库,然后调用那个数据库的过程,因为oracle里面没有直接返回结果集的,所有我就想到了用参数游标,我觉得这3个都能支持参数游标的,直接java里面调用的方法不通罢了!
jisg_57 2011-12-20
  • 打赏
  • 举报
回复
以下为oracle中方法,仅供参考:

2.java中调用
2.1 (数据库使用连接池)
public String cursorTest(){
Connection conn = this.dao.getJdao().getConnection();
ResultSet rs = null;
try {
CallableStatement stmt = conn.prepareCall("{call cursor_test_package.cursor_test_pc(?,?)}");
stmt.setString(1, "测试");
stmt.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR );
stmt.execute();
rs = (ResultSet)stmt.getObject(2);
while(rs.next()){
System.out.println(rs.getString(1)+":"+rs.getString(2));
}
} catch (SQLException e) {
System.out.println("执行存储过程发生错误!"+e.getMessage());
e.printStackTrace();
}
return "ok";
}
2.2(数据库使用JDBC连接)
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.1:1521:ora","net7b.com","net7b");
oracle.jdbc.OracleCallableStatement stmt = (oracle.jdbc.OracleCallableStatement)conn.prepareCall("{call audit.sp_audit_GetTaxpayerList(?, ?)}");
stmt.setString( 1, "23201020100");
stmt.registerOutParameter( 2, oracle.jdbc.OracleTypes.CURSOR );
stmt.execute();
rs = stmt.getCursor( 2 );
ehack 2011-12-20
  • 打赏
  • 举报
回复
上面3楼说的都不行了!不用output直接返回,那么java里面怎么写呢?有具体代码没!
我这里没有把全部代码列出来,我这个是多数据库的版本,还要考虑到oralce和mysql的
oracle里面我也是用
procedure syspro_getfacresinfotree(iuserid  in varchar2,
ilang in varchar2,
p_cursor out cursortype)

在java里面就写成了OracleTypes.CURSOR;这个类型
谢谢帮我列出下代码!
快溜 2011-12-20
  • 打赏
  • 举报
回复
返回一个游标?你想干什么
-晴天 2011-12-20
  • 打赏
  • 举报
回复
使用 cursor varying output 的目的,是为了在 MSSQL 中调用过程时,获得一个已打开的游标.
注意,这儿是指在MSSQL中处理的游标,并非你的客户端程序从服务器取得的记录集游标.
或者可以说,你的JAVA客户端,是无法处理 varying output 带出的游标的.

其实,你只要在存储过程中设置一个查询语句,你的JAVA程序调用这个存储过程后,可以获得一个记录集,在程序中处理记录集,类似于在 MSSQL 中处理游标.
--小F-- 2011-12-20
  • 打赏
  • 举报
回复
设置了 OUTPUT参数 可以直接返回
--小F-- 2011-12-20
  • 打赏
  • 举报
回复
ALTER PROCEDURE [dbo].[syspro_getfavorites]
-- Add the parameters for the stored procedure here
@iuserid varchar(40),
@ilang varchar(40)

BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
select b.res_id id, b.upid pid, a.res_name name, a.res_enname, a.res_url, (case
when a.res_open = '0' then
'false'
else
'true'
end) 'open'
from syst_res_info a, syst_res_rel b, syst_res_list c, syst_factory_info d
where a.deleteflag = '0'
and a.res_state = '0'
and a.id = b.res_id
and b.res_list_id = c.id
and c.id = d.res_list_id
and c.is_base = '1';

end
kingtiy 2011-12-20
  • 打赏
  • 举报
回复

ALTER PROCEDURE [dbo].[syspro_getfavorites]
-- Add the parameters for the stored procedure here
@iuserid varchar(40),
@ilang varchar(40)

BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
select b.res_id id, b.upid pid, a.res_name name, a.res_enname, a.res_url, (case
when a.res_open = '0' then
'false'
else
'true'
end) 'open'
from syst_res_info a, syst_res_rel b, syst_res_list c, syst_factory_info d
where a.deleteflag = '0'
and a.res_state = '0'
and a.id = b.res_id
and b.res_list_id = c.id
and c.id = d.res_list_id
and c.is_base = '1';
--直接返回就是了,不像oracle需要用游标返回的.
end
---创建数据库 create database CRM; --删除数据库 drop database CRM; --创建一个表 if exists(select * from sysobjects where name='Users') drop table Users go create table Users( Id int identity(1,1) not null primary key, --顾客编号,主键 按一进行自动增长 UserName varchar(50)not null, PassWord varchar(50)not null, Address varchar(250)not null, ) go ----------------------------------------插入100条数据进Users表,进行下面对分页做准备---------------- Begin Declare @n bigint Declare @Sql nvarchar(225) set @n=0 While @n<100--导入100条相同的数据进Users表 Begin Set @Sql='Insert into Users Values(''jilongliang'',''123456'',''广东阳春'')' Exec (@Sql) set @n=@n+1 End End ------------查询一下是不是插入--------------- Select *from Users; -------------------------存储过程创建语法----------------------------------- /* 1.存储过程创建语法 create proc | procedure pro_name [{@参数数据类型} [=默认值] [output], {@参数数据类型} [=默认值] [output], .... ] as SQL_statements */ --------------------------------------------------------------------------------- -------------------------- 带参存储过程----------------------------------- if (object_id('proc_find_users', 'P') is not null) drop proc proc_find_users go create proc proc_find_users(@startId int, @endId int) as ---between and 表示在那个两个数字之间 select * from users where Id between @startId and @endId go exec proc_find_users 42, 64; --------------------------------------------------------------------------------- --------------------------------带通配符参数存储过程----------------------------- if (object_id('proc_findUsersByName', 'P') is not null) drop proc proc_findUsersByName go create proc proc_findUsersByName(@UserName varchar(20) = '%j%', @nextName varchar(20) = '%') as select * from Users where UserName like @UserName and UserName like @nextName; go exec proc_findUsersByName; exec proc_findUsersByName '%l%', 'j%'; --------------------------------------------------------------------------------------- ----------------------------------------带输出参数存储过程--------------------------------------- if (object_id('proc_getUsersRecord', 'P') is not null) drop proc proc_getUsersRecord go create proc proc_getUsersRecord( @Id int, --默认输入参数 @UserName varchar(20) out, --输出参数 @address varchar(20) output --输入输出参数 ) as select @UserName = UserName, @address = address from Users where Id = @Id and Address = @address; go ---------------声明变量 declare @id int, @address varchar(20), @UserName varchar(20), @temp varchar(20); set @id = 71; set @temp = 1; exec proc_getUsersRecord @id, @UserName out, @temp output; select @UserName as 用户名, @temp as temp,@address as 地址; print @UserName + '#' + @temp; --------------------------------------------------------------------------------------- -----------------------------------不缓存存储过程--------------------------------------- --WITH RECOMPILE 不缓存 if (object_id('proc_temp', 'P') is not null) drop proc proc_temp go create proc proc_temp with recompile as select * from users; go exec proc_temp; -----------------------------------加密存储过程------------------------------------- --加密WITH ENCRYPTION if (object_id('proc_temp_encryption', 'P') is not null) drop proc proc_temp_encryption go create proc proc_temp_encryption with encryption as select * from users; go exec proc_temp_encryption; exec sp_helptext 'proc_temp'; exec sp_helptext 'proc_temp_encryption'; -----------------------------------带游标参数存储过程------------------------------------- if (object_id('proc_cursor', 'P') is not null) drop proc proc_cursor go create proc proc_cursor @cur cursor varying output as set @cur = cursor forward_only static for select Id, UserName, Address from Users; open @cur; go --调用 declare @exec_cur cursor; declare @Id int, @UserName varchar(50), @Address varchar(250); exec proc_cursor @cur = @exec_cur output;--调用存储过程 fetch next from @exec_cur into @Id, @UserName, @Address; while (@@fetch_status = 0) begin fetch next from @exec_cur into @Id, @UserName, @Address; print 'Id: ' + convert(varchar, @Id) + ', name: ' + @UserName + ', Address: ' + @Address; end close @exec_cur; deallocate @exec_cur;--删除游标 ---------------------------------------------------------- select * from sys.messages; --使用sysmessages中定义的消息 --------------------------------Query--------------------- Create PROCEDURE proc_LoginUser @userName varchar(50), @password varchar(50) as begin select UserName,PassWord from Users where UserName = @userName and PassWord = @PassWord end GO --这个Go注意不要放在Exec后面,否则报超出了存储过程、函数、 --触发器或视图的最大嵌套层数(最大层数为 32) exec proc_LoginUser @userName = 'admin',@PassWord = 'admin' --------------------------------Insert--------------------- Create proc proc_InsertUsers @UserName varchar(50), @PassWord varchar(50), @Address varchar(150) as insert into proc_InsertUsers values(@UserName,@PassWord,@Address) --------------------------------Update--------------------- --修改模块信息,根据模块Id Create proc proc_UpdateUser @UserName varchar(50), @PassWord varchar(50), @Address varchar(150), @Id int as update Users set UserName=@UserName,PassWord=@PassWord ,Address=@Address where Id = @Id --------------------------------Delete--------------------- Create proc proc_DeleteById @Id int as delete from Users where Id=@Id ----------------------------------------------------------- ------------------------------------------------------------------------------------- ----------------------------------分页存储过程-------------------------------------- ------------------------------------------------------------------------------------- If (object_id('pro_page', 'P') is not null) drop proc proc_Page GO create procedure proc_Page( @pageIndex int, @pageSize int ) as declare @startRow int, @endRow int --声明变量 set @startRow = (@pageIndex - 1) * @pageSize +1 --设值 set @endRow = @startRow + @pageSize -1 --设值 select ID,UserName,Address,PassWord,t.number from --t.number的行号 ( select ID,UserName,Address,PassWord, row_number() over (order by id asc) as number from Users ) t where t.number between @startRow and @endRow; GO ----执行 exec proc_Page 1, 3; -- 一页,三条数据 ------------------------------------------------------------------------------------- ---存储过程、row_number完成分页 if (object_id('pro_page', 'P') is not null) drop proc proc_cursor -- drop proc pro_page go create proc pro_Page @startIndex int, @endIndex int as select count(*) as Total from Users; --计算出来总数 select * from ( select row_number() over(order by Id) as rowId, * from Users ) temp where temp.rowId between @startIndex and @endIndex go exec pro_Page 1, 4 ------------------------------------------------------------------------------------- -------------------------------------数据库的函数-------------------------------------- exec sp_databases; --查看数据库 exec sp_tables; --查看表 exec sp_columns users;--查看列 exec sp_helpIndex users;--查看索引 exec sp_helpConstraint users;--约束 exec sp_stored_procedures; exec sp_helptext 'sp_stored_procedures';--查看存储过程创建、定义语句 exec sp_rename users, stuInfo;--修改表、索引、列的名称 exec sp_renamedb myTempDB, myDB;--更改数据库名称 exec sp_defaultdb 'master', 'myDB';--更改登录名的默认数据库 exec sp_helpdb;--数据库帮助,查询数据库信息 exec sp_helpdb master; ------------------------------------------------------------------------------------- ---------------------------数据库的sp_rename重命名函数------------------------------- --表重命名 exec sp_rename 'users', 'tb_users'; select * from tb_users; --列重命名 exec sp_rename 'tb_users.name', 'sName', 'column'; exec sp_help 'tb_users'; --重命名索引 exec sp_rename N'tb_users.idx_cid', N'idx_cidd', N'index'; exec sp_help 'tb_users'; --查询所有存储过程 select * from sys.objects where type = 'P'; select * from sys.objects where type_desc like '%pro%' and name like 'sp%';

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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