【问题标题】:How to pass current record as parameter to a routine?如何将当前记录作为参数传递给例程?
【发布时间】:2021-09-09 06:02:21
【问题描述】:

我正在尝试使用例程通过 jOOQ 调用 PL/SQL 函数。函数如下:

CREATE OR REPLACE FUNCTION myschema.default_sort(rec myschema.mytable)
  RETURNS text
  LANGUAGE SQL
  IMMUTABLE
AS $$
  SELECT
      TO_CHAR($1.created_at, 'YYYYMMDDHHMMSSMS') ||  myschema.encode($1.id)
$$;

我希望能够执行以下等效操作:

SELECT 
    mt.*,
    myschema.default_sort(mt)
FROM
    myschema.mytable mt; 

所以在jOOQ中,生成了例程:

public static Field<String> defaultSort(MyTableRecord rec) {
//do stuff
}

但是到调用的时候,我不知道如何在例程中传递当前行:

dsl.select(
        Tables.MYTABLE.asterisk(),
        Routines.defaultSort( /* What goes here? */)
    )
        .from(Tables.MYTABLE)

我在Tablesdsl 对象上找不到任何暗示当前记录的内容。我该怎么做?

【问题讨论】:

    标签: java jooq


    【解决方案1】:

    从 jOOQ 3.15 开始,您还不能将 Field&lt;TableRecord&gt; 表达式 传递给生成的存储函数引用,只能传递 TableRecord ,它在客户。在 jOOQ 的近期版本中,这绝对是一个有趣的改进。 jOOQ 3.15 将开始允许使用 ad-hoc ROW 类型作为 SelectField 进行预测:https://github.com/jOOQ/jOOQ/issues/11812

    将这种功能也提供给Table 类型是有意义的,它们是名义上的ROW 类型:

    与此同时,当 jOOQ 中缺少特定于供应商的功能时,您可以求助于plain SQL templating 并使用:

    DSL.field("myschema.default_sort({0})", SQLDataType.VARCHAR, MYTABLE);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-17
      • 1970-01-01
      • 2012-12-17
      • 1970-01-01
      • 1970-01-01
      • 2013-03-17
      相关资源
      最近更新 更多