Как вызвать процедуру с помощью jooq в выражении блока - PullRequest
1 голос
/ 26 февраля 2020

Я хотел поиграть с новой функцией 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;

Но я не могу понять, как написать вызов DBMS_LOB.append с JOOQ. Пока я получил это:

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();

1 Ответ

0 голосов
/ 27 февраля 2020

Хотя хранимые функции можно вызывать из анонимных блоков в процедурном API jOOQ, к сожалению, мы пока не можем смоделировать вызовы хранимых процедур в процедурном API jOOQ 3.13. Соответствующий запрос функции: 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();
...