jOOQ - 使用refcursor执行postgres用户定义的函数

时间:2018-06-06 09:27:34

标签: java postgresql jooq

我在执行函数时遇到一些问题,这些函数在jooq中获取并返回postgres refcursor。我不知道如何使用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 :(得分:1)

jOOQ支持PostgreSQL中的refcursor结果类型(或OUT参数),但不支持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时)来定义生成的游标名称。

但是,您可能需要在事务中运行函数调用。