Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jOOQ-使用refcursor执行postgres用户定义函数_Java_Postgresql_Jooq - Fatal编程技术网

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

Java jOOQ-使用refcursor执行postgres用户定义函数,java,postgresql,jooq,Java,Postgresql,Jooq,我在执行函数时遇到了一些问题,这些函数在jooq中接受并返回postgresrefcursor。我不知道如何实例化ref,即Result,也不知道如何循环通过我想要执行的函数应该获得的记录 假设我在postgres(postgres 9.5)中有以下函数: 在博士后,我是这样执行的: begin; select foo_cursor('Konrad', 'my_cursor'); fetch all in "my_cursor"; commit; 函数必须保持不变-它返回refcursor,并

我在执行函数时遇到了一些问题,这些函数在jooq中接受并返回postgres
refcursor
。我不知道如何实例化
ref
,即
Result
,也不知道如何循环通过我想要执行的函数应该获得的记录

假设我在postgres(postgres 9.5)中有以下函数:

在博士后,我是这样执行的:

begin;
select foo_cursor('Konrad', 'my_cursor');
fetch all in "my_cursor";
commit;
函数必须保持不变-它返回
refcursor
,并接受
refcursor

我想在jOOQ中执行它:

Routines.fooCursor(configuration, "Konrad", ____);
但是我不知道在
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我试过这样的方法:

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

但它也不起作用。

jOOQ支持PostgreSQL中的
refcursor
结果类型(或
OUT
参数),但不支持
in
参数类型,这确实有点奇怪,因为它假装是标识符的伪类型。如果可以将函数重载到此值:

创建或替换函数foo\u游标(名称字符变化)
返回refcursor
作为$func$
声明
参考光标;
开始
公开引用
选择id、名字、姓氏
来自学生
其中first_name=name;
返回ref;
结束
$func$
语言plpgsql;
然后,jOOQ将能够调用该函数。jOOQ(或者您在使用jOOQ时)不需要定义结果游标名称


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

谢谢您的回复。我检查了它,但当我使用
Routines.fooCursor(配置)
时,它会给我
DataAccessException
,并显示消息
org.postgresql.util.psqleexception:ERROR:cursor“”不存在
。我试图用
declare ref-cursor:=“mycursor”实例化
refcursor
但是我会得到同样的错误,告诉我
mycursor
不存在。@kodi1911:您是否在事务中运行jOOQ代码?在
context.transactionResult(config->Routines.fooCursor(config.getValues)(“first_name”,String.class))中运行它完成工作。谢谢你的帮助。你很棒:)事实上,我模模糊糊地记得当从JDBC客户端调用refcursor函数时,事务是必需的。。。谢谢你的好话:)
Result<Record> records = DSL.using(configuration).newResult();