jOOQ - выполнить пользовательскую функцию postgres с refcursor - PullRequest
0 голосов
/ 06 июня 2018

У меня проблемы с выполнением функций, которые принимают и возвращают postgres refcursor в jooq.Я понятия не имею, как подходить к экземпляру ref, то есть Result<Record>, и как проходить по записям, которые я должен получить из функции, которую я хочу выполнить.

Допустим, у меня есть следующая функцияв postgres (postgres 9.5):

create or replace function foo_cursor(name character varying, ref refcursor)
returns refcursor
as $func$
begin
  open ref for
    select id, first_name, last_name
    from students
    where first_name = name;
  return ref;
end
$func$ 
language plpgsql;

И в postgres я выполняю вот так:

begin;
select foo_cursor('Konrad', 'my_cursor');
fetch all in "my_cursor";
commit;

Функция должна оставаться прежней - она ​​возвращает refcursor изанимает refcursor.

И я хочу выполнить это в jOOQ:

Routines.fooCursor(configuration, "Konrad", ____);

Но я не знаю, что поместить в ____, что занимает Result<Record>.Я попробовал что-то вроде:

Result<Record> records = DSL.using(configuration).newResult();

, но это тоже не сработало.

1 Ответ

0 голосов
/ 06 июня 2018

jOOQ поддерживает тип результата refcursor (или параметр OUT) в PostgreSQL, но не тип параметра IN, что на самом деле немного странно, учитывая, что он притворяется псевдотипом дляидентификатор.Если вы можете перегрузить свою функцию следующим образом:

create or replace function foo_cursor(name character varying)
returns refcursor
as $func$
declare
  ref refcursor;
begin
  open ref for
    select id, first_name, last_name
    from students
    where first_name = name;
  return ref;
end
$func$ 
language plpgsql;

Тогда jOOQ сможет вызвать функцию.Для jOOQ (или для вас, когда вы используете jOOQ) нет необходимости определять результирующее имя курсора.

Однако вам может потребоваться выполнить вызов функции внутри транзакции.

...