如何将当前记录作为参数传递给例程?

How to pass current record as parameter to a routine?

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

CREATE OR REPLACE FUNCTION myschema.default_sort(rec myschema.mytable)
  RETURNS text
  LANGUAGE SQL
  IMMUTABLE
AS $$
  SELECT
      TO_CHAR(.created_at, 'YYYYMMDDHHMMSSMS') ||  myschema.encode(.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 对象上找不到任何提示当前记录的内容。我该怎么做?

从 jOOQ 3.15 开始,您还不能将 Field<TableRecord> expression 传递给生成的存储函数引用,只能传递 TableRecord value,在客户端构造。这绝对是 jOOQ 近期版本的一个有趣的改进。 jOOQ 3.15 将开始允许使用临时 ROW 类型作为 SelectField 进行投影:https://github.com/jOOQ/jOOQ/issues/11812

也为 Table 类型提供这种功能是有意义的,这些类型是名义上的 ROW 类型:

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

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