Получение результатов из функции Postgresql с табличным значением с помощью JOOQ

У меня есть функция Postgresql, которая возвращает таблицу

CREATE OR REPLACE FUNCTION test_func(IN param1 text, IN param2 integer)
  RETURNS TABLE(result1 text, result2 integer) AS
  $BODY$
  BEGIN
   result1 := 'aa';
   result2 :=1;
   return next;
   result1 := 'bb';
   result2 :=2;
   return next;
  END
  $BODY$
  LANGUAGE plpgsql

Запрос в pg-admin возвращает правильный результат

select * from test_func('aaa', 23);
result1 | result2
"aa"    | 1
"bb"    | 2

JOOQ генерирует функцию как всегда

...
public class TestFunc extends org.jooq.impl.AbstractRoutine<java.lang.Void> {
...
public TestFunc() {
    super("test_func", ee.tavex.tavexwise.db.public_.Public.PUBLIC);

    addInParameter(PARAM1);
    addInParameter(PARAM2);
    addOutParameter(RESULT1);
    addOutParameter(RESULT2);
}
...

и в классе рутины

...
public static ee.tavex.tavexwise.db.public_.routines.TestFunc testFunc(org.jooq.Configuration configuration, java.lang.String param1, java.lang.Integer param2) {
    ee.tavex.tavexwise.db.public_.routines.TestFunc p = new ee.tavex.tavexwise.db.public_.routines.TestFunc();
    p.setParam1(param1);
    p.setParam2(param2);

    p.execute(configuration);
    return p;
}

я называю это так

TestFunc records = Routines.testFunc(dslConfiguration, "xx", 10);


records.getResults()  //returns empty List
records.getResult1() //returns "aa"
records.getResult2() //returns 1

Итак, он правильно возвращает значения первой строки, но как я могу получить всю таблицу?

(жук 3.5.0)


person Juri Krainjukov    schedule 07.02.2015    source источник
comment
Нет. Я пытаюсь сделать запрос, используя регенерированные подпрограммы JOOQ. Теперь сгенерированный идентичен тому, который я получаю, когда функция возвращает только одну запись. Я не могу получить описанный здесь результат jooq.org/doc/3.5/manual/sql-building/table-expressions/   -  person Juri Krainjukov    schedule 08.02.2015
comment
@ user693442: Можете ли вы показать код jOOQ, который вы используете? Можете ли вы также показать тело функции, просто чтобы убедиться, что там все в порядке?   -  person Lukas Eder    schedule 08.02.2015
comment
Обновил вопрос   -  person Juri Krainjukov    schedule 08.02.2015
comment
Спасибо за обновления. Интересно, я не понимаю этот конкретный метод testFunc(Configuration, String, Integer) (см. мой ответ). Там может быть тонкий баг. Не могли бы вы передать это в группе пользователей jOOQ? Будет легче обсудить дальнейшие шаги, чтобы увидеть, что могло вызвать ошибку (возможно, версия PostgreSQL?)   -  person Lukas Eder    schedule 09.02.2015


Ответы (1)


Правильный способ вызова функций с табличным значением из jOOQ — использовать их в FROM предложениях как описано на странице руководства, на которую вы ссылаетесь.

В вашем случае это будет:

Result<TestFuncRecord> result =
DSL.using(configuration)
   .selectFrom(Routines.testFunc("xx", 10))
   .fetch();

Или также начиная с jOOQ 3.6

Result<TestFuncRecord> result =
DSL.using(configuration)
   .selectFrom(Tables.TEST_FUNC("xx", 10))
   .fetch();

Генератор кода jOOQ обрабатывает табличные функции как обычные таблицы, а не как подпрограммы. Вот почему в Routines не должно быть метода, принимающего аргумент Configuration.

person Lukas Eder    schedule 09.02.2015
comment
@ user693442 спасибо за согласие. Какова была реальная проблема, с которой вы столкнулись? т.е. Вы выяснили, что привело к неправильно сгенерированным подпрограммам? - person Lukas Eder; 10.02.2015
comment
У меня было несколько jooq jar разных версий в моем пути к классам. И вторая проблема связана с перегруженными табличными процедурами. Я разместил отдельный вопрос для этого stackoverflow.com/questions/28434559/ - person Juri Krainjukov; 10.02.2015
comment
@user693442: Хм, да, это определенно может вызвать проблемы... Спасибо за отзыв. - person Lukas Eder; 10.02.2015