【问题标题】:How to get result set from store procedure with parameter in jbdc如何在jdbc中使用参数从存储过程中获取结果集
【发布时间】:2018-10-06 00:21:03
【问题描述】:

我只有 1 个参数的存储过程。我可以在 microsoft SQL Server Management Studio 中执行像 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;

我收到一条错误消息,说“该语句未返回结果集。” statement.setString(1,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'

【问题讨论】:

  • 好吧,我可以指出大约 40 件事,但首先尝试删除 statement.Execute(),为什么在执行 .executeQuery() 时还需要它?还可以尝试将SET NOCOUNT ON; 添加到过程主体的开头。一些库将done_in_proc 消息解释为结果集,这可能会混淆代码,认为第一个结果集具有该列。
  • 你能给我们一个kata的示例值吗?您也可以将您的 usp_ 更改为 'select 'KataValue'' 然后通过代码调用它,这将强制传递一个已知值。这将告诉您您的应用程序代码是否有问题或者是您的 SQL
  • 哇.. 'set nocount on' 就像魅力一样工作。感谢您的帮助。所以我应该在我的其他类似存储过程中使用“set nocount on”?

标签: java sql sql-server stored-procedures resultset


【解决方案1】:

为了使用可调用语句调用存储过程,您需要 registerOutParameter 以获得预期结果。你也不需要在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);
 ....

我现在懒得看过程调用;)但我想如果你能在管理工作室中执行它就可以了

【讨论】:

    【解决方案2】:

    所以我要使语句返回结果集是我在存储过程的开头添加SET NOCOUNT ONset nocount explanation is here.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-18
      • 2023-03-28
      • 1970-01-01
      • 2010-11-13
      • 1970-01-01
      • 1970-01-01
      • 2021-03-27
      • 2011-07-24
      相关资源
      最近更新 更多