LINUX.ORG.RU

Java JDBC функции

 ,


0

1

Всем привет, назрела такая вот проблема: есть ms sql сервер, на нем написаны различные функции, которые возвращают таблицы, обращаюсь к ним из java-приложения, через callable statement, используя call и имя функции.

func = connection.prepareCall("{ call " + storedProcedureName + " (?)}");

Но после того, как я выполняю вызов процедуры, приложение крашится и выдается следующая ошибка: Выполнение запроса окончилось неудачно, так как «FUNC» является объектом функция, возвращающая тип данных table.

Нагуглить что-то внятное не удается. Может быть, кто-то сталкивался?

рекомендую не страдать низовщиной(раз уж самостоятельно не удается догнать как это делается) и подключить MyBatis, ну и рядом посмотреть примеры как корректно вызывать процедуры «возвращающие» данные для MSSQL.
Для Oracle это делается так

SELECT * FROM TABLE(SomeProcderue(?, ?, ?))

FeyFre ★★★★
()
Ответ на: комментарий от FeyFre

Так это стандартный вызов функций, возвращающих таблицы, в мсскл, а мне же из джавы вызывать надо. Есть куча туториалов, в которых описывается как возвращать один параметр, но нигде нет как возвратить таблицу.

misterious
() автор топика
Ответ на: комментарий от misterious

Так это стандартный вызов функций, возвращающих таблицы

Так что вам ещё не хватает? Результат SELECT-а на какую-либо таблицу как из явы читаете? Вот так же и читается SELECT на результат функции которая возвращает курсор(«таблицу» в вашей терминологии). Что не понятно?

FeyFre ★★★★
()

если открыть the fucking manual по CallableStatement (который возвращает prepareCall) то можно увидеть следующий код:

   {?= call <procedure-name>[(<arg1>,<arg2>, ...)]}

это даже если не читать ни оный ни туториалы

Deleted
()
Последнее исправление: Deleted (всего исправлений: 2)
Ответ на: комментарий от misterious

значит ты что-то делаешь не так

Deleted
()
Ответ на: комментарий от misterious

ну если функция возвращает одиночное значение, то что ещё ждать? Сделай из него таблицу. Полон гугол вопросов и ответов SELECT functionName(args...); Не подходит?

FeyFre ★★★★
()

В MS SQL Server есть 2 типа пользовательских функций: скалярные и табличные. Чтобы заселектить то, что возвращает скалярная функция, достаточно написать

select result=dbo.uf_my_scalar_func(someArgs)

В случае табличной функции селект будет выглядеть так:

select * from dbo.uf_my_table_func(someArgs)

По сути эти два запроса ничем не отличаются от обычных селектов. Поэтому делаем как в обычном jdbc:

try (PreparedStatement st = conn.prepareStatement("select * from dbo.uf_my_table_func(someArgs)") {
  try (ResultSet resultSet = st.executeQuery()) {
    while (resultSet.next()) {
      System.out.println(resultSet.getString("someResultField"))'
    }
  }
}
x_zealot
()
Ответ на: комментарий от etwrq

нет. «select functionName(args,...,...) from dual;» всегда курсор с 1 результатом(с 1 колонкой - результатом функции), a «SELECT * FROM TABLE(function(args))» курсор-результат функции можно использовать как таблицу в различных выборках.

FeyFre ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.