如何在块语句中使用 jooq 调用过程

How to call a procedure with jooq in a block statement

我想体验新的 jOOQ 块语句功能。 我的用例相当简单。至少我是这么认为的 ;-)

我想执行以下 SQL 语句作为匿名块

DECLARE
  v_clobdata clob;
Begin 
 select t.clob_field into v_clobdata from TEST.MY_TABLE t where t.id = 1 for update;
  DBMS_LOB.append(dest_lob => v_clobdata ,  src_lob => 'append_this');
  update TEST.MY_TABLE t set t.clob_field n = v_clobdata where t.id = 1;
END;

但我不知道如何用 jOOQ 编写 DBMS_LOB.append 调用。到目前为止我得到了这个:

String textToAppend = "append_this";
long id = 1L;

final MY_TABLE  t = MY_TABLE .as("t");
final Variable<String> clobdata = var("v_clobDaten", SQLDataType.CLOB);
create.begin(
  declare(clobDaten),
  clobdata.set(select(t.CLOB_FIELD).from(t).where(t.ID.eq(id)).forUpdate()),
  //how  "DBMS_LOB.append(dest_lob => v_clobDaten,  src_lob => 'append_this')
  update(t).set(t.CLOB_FIELD, clobdata ).where(t.ID.eq(id))
).execute();

虽然可以在 jOOQ 的程序 API 中从匿名块调用存储函数,但不幸的是,我们还不能在 jOOQ 3.13 的程序 API 中模拟存储过程调用。相关的功能请求是这个:https://github.com/jOOQ/jOOQ/issues/9169

作为解决方法,您可以使用普通的 SQL 语句 API:DSL.statement()

create.begin(
  declare(clobDaten),
  clobdata.set(select(t.CLOB_FIELD).from(t).where(t.ID.eq(id)).forUpdate()),
  statement("dbms_lob.append(dest_lob => {0}, src_lob => 'append_this')", clobdata),
  update(t).set(t.CLOB_FIELD, clobdata).where(t.ID.eq(id))
).execute();

或者,在这种特殊情况下,您也许可以只使用连接:

create.update(t)
      .set(t.CLOB_FIELD, t.CLOB_FIELD.concat("append_this"))
      .where(t.ID.eq(id))
      .execute();