Как получить набор результатов из хранимой процедуры с параметром в jbdc - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть процедура сохранения только с 1 параметром.Я могу выполнить процедуру, подобную этой exec proc_name param1, в Microsoft SQL Server Management Studio и показать набор результатов, который я хочу.Но когда я пытаюсь в 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) имеет тип String.

Это мой код процедуры магазина на случай, если что-то не так

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'

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Итак, что я делаю, чтобы сделать набор результатов, возвращаемых оператором, я добавляю SET NOCOUNT ON в начале моей процедуры хранения. здесь объяснение номера счета.

0 голосов
/ 25 апреля 2018

Чтобы вызвать хранимые процедуры с вызываемым оператором, необходимо зарегистрироватьOutParameter для ожидаемых результатов.Также вам не нужно executeQuery после execute, потому что у вас нет запроса, и вы уже выполнили свой оператор

Попробуйте изменить свой код на:

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);
 ....

Я не могу потрудиться взглянуть на вызов процедуры прямо сейчас;) но я думаю, это сработает, если вы сможете выполнить его в студии управления

...