当前位置: 首页 > 知识库问答 >
问题:

如何使用jooq(postgresql)处理批处理执行中的任何数组参数化存储函数?

龚弘业
2023-03-14

我有如下db模式:

CREATE FUNCTION public.some_fun(anyarray) RETURNS anyarray AS $$
  SELECT $1;
$$ LANGUAGE sql;

CREATE TABLE some_table (some_col int[]);

我用java调用以下代码:

DSLContext ctx = ... // retrieve DSLcontext
Query query = ctx.insertInto(Tables.SOME_TABLE)
    .values((Field) someFun(new Integer[]{1}));
ctx.batch(query).execute();

代码生成异常:

org.postgresql.util。PSQLException:错误:无法确定多态类型,因为输入的类型为“未知”

生成的查询是:

插入“public”。“some\u table”(“some\u col”)值(“public”。“some\u fun”(“{”1“}”))

结果表明,jooq没有显式地对数组进行类型转换,postgres无法推断数组类型。

有趣的是,以下代码生成了相同的查询,并且确实有效:

Query query = ctx.insertInto(Tables.SOME_TABLE)
    .values((Field) someFun(new Integer[]{1}));
query.execute();

我想这个问题与jdbc如何处理批处理查询有关,除非jooq将不同的查询记录到它真正执行的内容。我使用以下代码找到了解决该问题的黑客方法:

Query query = ctx.insertInto(Tables.SOME_TABLE)
    .values(
        (Field) someFun(
            DSL.field(DSL.array(new Integer[]{1}).toString() + "::int[]")
        )
    );
ctx.batch(query).execute();

我还试图通过将cast mode设置为总是,使jooq总是显式地键入cast值,但似乎不起作用:

ctx.renderContext().castMode(RenderContext.CastMode.ALWAYS);
Query query = ctx.insertInto(Tables.SOME_TABLE)
    .values((Field) someFun(new Integer[]{1}));
ctx.batch(query).execute();

我真的需要以手动方式进行类型转换吗?还是有更好的方法来处理这个问题?

更新

通过如下生成类型转换字符串,可以使转换不那么令人沮丧:

String.format("::%s[]", DefaultDataType.getDataType(SQLDialect.POSTGRES, Integer[].class).getCastTypeName())

不过,这只是一个变通方法。

共有1个答案

轩辕奕
2023-03-14

截至jOOQ 3.8,PostgreSQL的any、anyarray和其他多态数据类型尚不受支持。对此有一个挂起的功能请求:https://github.com/jOOQ/jOOQ/issues/5479

你的变通方法可能和现在一样好。

 类似资料:
  • 问题内容: 伙计们。说,我有一个查询: 我用以下方式重写了它: 让我们将其视为消耗资源的一种。我认为,在第二个查询中,它的调用次数要少两次,但是在进行此更改后,我并没有发现任何显着的性能提升。 因此,我想我的假设是错误的。那么,Oracle实际如何处理这些函数调用? 问题答案: 这是一个非常好的问题。 我首先尝试创建表并插入示例数据(仅五行): 我制作了一个简单的测试包对此进行了测试。 和身体…

  • 主要内容:函数定义函数是组织在一起执行特定任务的一组语句。 在批处理脚本中,采用类似的方法将逻辑语句组合在一起形成一个函数。 像其他语言一样,批处理脚本中的函数也遵循相同的程序规则 - 函数声明 - 它告诉编译器一个函数的名字,返回类型和参数。 函数定义 - 它提供了函数的实际主体。 函数定义 在批处理脚本中,通过使用标签语句来定义函数。 当一个函数被重新定义时,它可能会将一个或多个值作为函数的输入“参数”,并在函

  • 主要内容:创建一个数组,访问数组,修改数组,迭代数组,数组的长度,在数组中创建结构数组类型并没有明确定义为批处理脚本中的类型,但可以实现。 在批处理脚本中实现数组时需要注意以下几点。 数组中的每个元素都需要用命令来定义。 循环将需要遍历数组的值。 创建一个数组 一个数组是通过使用下面的命令创建的。 其中是数组的索引,是分配给数组的第一个元素的值。 另一种实现数组的方法是定义一个值列表并遍历值列表。 以下示例显示了如何实现。 示例 以上命令产生以下输出 - 访问数组 可以使用下标

  • 我编写了一个简单的spring批处理tasklet,它调用一个dao方法,该方法反过来执行一些删除操作。但我不确定该怎么称呼这份工作。 到目前为止,为了执行我的spring批处理作业,我使用了类似于这样的设置的quartz触发器。每个作业都有自己的xml文件,该文件具有读写器。 然后这里是一个作业文件本身的示例,包含一个读写器。 显然,这份新工作没有读者或作家。那么,我执行新任务的最佳/正确方式是

  • 本文向大家介绍javascript日期处理函数,性能优化批处理,包括了javascript日期处理函数,性能优化批处理的使用技巧和注意事项,需要的朋友参考一下 其实网上写javascript日期格式化的博文很多,大体都看了看,都还不错。唯一遗憾的是只顾着实现了功能,没对函数进行性能优化。 俗话说:不要重复造轮子。google上找了一个比较不错的日期格式化函数,来开始我的优化之旅吧! google上

  • 我喜欢确定Java运行时环境可用并检查它们的版本。我的代码将输出正确的jre路径,但无法执行java.exe. 当程序路径是变量时,用批处理脚本中的参数调用程序的正确方法是什么? 我的剧本 错误