Получаване на резултати от таблична функция 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

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

(jooq 3.5.0)


person Juri Krainjukov    schedule 07.02.2015    source източник
comment
Не. Опитвам се да направя заявката, използвайки JOOQ renerated рутинни процедури. Сега генерираният е идентичен с този, който получавам, когато функцията връща само един запис. Не мога да получа резултат, описан тук 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 User Group? Ще бъде по-лесно да обсъдим по-нататъшни стъпки, за да видим какво може да е причинило грешката (може би версията на 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