如何从jdbc中带参数的存储过程中获取结果集
How to get result set from store procedure with parameter in jbdc
我有只有 1 个参数的存储过程。我可以在 Microsoft SQL 服务器管理工作室中执行这样的过程 exec proc_name param1
并显示我想要的结果集。但是当我尝试使用我的代码 java 时:
String url = "jdbc:sqlserver://TOSHIBA\SQLEXPRESS;databaseName=Perpustakaan;integratedSecurity=true";
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
conn = DriverManager.getConnection(url);
CallableStatement statement = conn.prepareCall("{call search(?)}");
statement.setString(1,parameter);
ArrayList<Buku> result = new ArrayList<>();
statement.execute();
ResultSet rs = statement.executeQuery();
while (rs.next()) {
int tempId = rs.getInt("id");
String tempJudul = rs.getString("judul");
result.add(new Buku(tempId, tempJudul));
}
return result;
我收到一条错误消息说 'The statement did not return a result set.' statement.setString(1,parameter)
中的 'parameter' 是字符串类型。
这是我的存储过程代码,以防出错
alter proc search
@kata varchar(255)
as
declare @tempResult table
(
kata varchar(255)
)
declare
@idx int,
@katas varchar(255)
set @katas = @kata
set @idx = CHARINDEX(',',@katas,1)
while(@idx != 0)
begin
insert into @tempResult
select
SUBSTRING(@katas,1,@idx-1)
set @katas = SUBSTRING(@katas,@idx+1,100000000)
set @idx = CHARINDEX(',',@katas,1)
end
insert into @tempResult
select
@katas
declare @searchResult table
(
judul varchar(255)
)
insert into @searchResult
select dbo.buku.judul
from dbo.buku cross join @tempResult
where CHARINDEX(kata, dbo.buku.judul) > 0
select
dbo.buku.id, sr.judul
from
@searchResult as sr join dbo.buku
on
sr.judul = dbo.buku.judul
group by
sr.judul, dbo.buku.id
order by
COUNT(sr.judul) desc
exec search 'Games'
为了使用可调用语句调用存储过程,您需要为预期结果注册OutParameter。此外,您不需要在 execute
之后 executeQuery
因为您没有查询并且您已经执行了语句
尝试将您的代码更改为:
boolean hasResults=statement.execute();
while (hasResults) {
ResultSet rs = cStmt.getResultSet();
int tempId = rs.getInt("id");
String tempJudul = rs.getString("judul");
result.add(new Buku(tempId, tempJudul));
hasResults= cStmt.getMoreResults();
}
但在此之前,您应该将您期望的参数添加到语句中。就像你做的那样:
statement.setString(1,parameter);
// Add out parameters here
statement.registerOutParameter(1, java.sql.Types.INTEGER);
....
我现在懒得看程序调用 ;) 但我想如果您可以在管理工作室中执行它,它就可以工作
所以我做的声明 return 结果集是我在存储过程的开头添加 SET NOCOUNT ON
。
set nocount explanation is here.
我有只有 1 个参数的存储过程。我可以在 Microsoft SQL 服务器管理工作室中执行这样的过程 exec proc_name param1
并显示我想要的结果集。但是当我尝试使用我的代码 java 时:
String url = "jdbc:sqlserver://TOSHIBA\SQLEXPRESS;databaseName=Perpustakaan;integratedSecurity=true";
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
conn = DriverManager.getConnection(url);
CallableStatement statement = conn.prepareCall("{call search(?)}");
statement.setString(1,parameter);
ArrayList<Buku> result = new ArrayList<>();
statement.execute();
ResultSet rs = statement.executeQuery();
while (rs.next()) {
int tempId = rs.getInt("id");
String tempJudul = rs.getString("judul");
result.add(new Buku(tempId, tempJudul));
}
return result;
我收到一条错误消息说 'The statement did not return a result set.' statement.setString(1,parameter)
中的 'parameter' 是字符串类型。
这是我的存储过程代码,以防出错
alter proc search
@kata varchar(255)
as
declare @tempResult table
(
kata varchar(255)
)
declare
@idx int,
@katas varchar(255)
set @katas = @kata
set @idx = CHARINDEX(',',@katas,1)
while(@idx != 0)
begin
insert into @tempResult
select
SUBSTRING(@katas,1,@idx-1)
set @katas = SUBSTRING(@katas,@idx+1,100000000)
set @idx = CHARINDEX(',',@katas,1)
end
insert into @tempResult
select
@katas
declare @searchResult table
(
judul varchar(255)
)
insert into @searchResult
select dbo.buku.judul
from dbo.buku cross join @tempResult
where CHARINDEX(kata, dbo.buku.judul) > 0
select
dbo.buku.id, sr.judul
from
@searchResult as sr join dbo.buku
on
sr.judul = dbo.buku.judul
group by
sr.judul, dbo.buku.id
order by
COUNT(sr.judul) desc
exec search 'Games'
为了使用可调用语句调用存储过程,您需要为预期结果注册OutParameter。此外,您不需要在 execute
之后 executeQuery
因为您没有查询并且您已经执行了语句
尝试将您的代码更改为:
boolean hasResults=statement.execute();
while (hasResults) {
ResultSet rs = cStmt.getResultSet();
int tempId = rs.getInt("id");
String tempJudul = rs.getString("judul");
result.add(new Buku(tempId, tempJudul));
hasResults= cStmt.getMoreResults();
}
但在此之前,您应该将您期望的参数添加到语句中。就像你做的那样:
statement.setString(1,parameter);
// Add out parameters here
statement.registerOutParameter(1, java.sql.Types.INTEGER);
....
我现在懒得看程序调用 ;) 但我想如果您可以在管理工作室中执行它,它就可以工作
所以我做的声明 return 结果集是我在存储过程的开头添加 SET NOCOUNT ON
。
set nocount explanation is here.