1

我想玩新的 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();
4

1 回答 1

0

虽然可以在 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();
于 2020-02-27T09:55:58.513 回答