jooq генерирует нескомпилированный код из процедур Postgres

Теперь я пытаюсь использовать JOOQ в новой версии программы, которая одновременно общается с двумя БД. Но проблема исходит из процедур Postgres, которые я не могу деактивировать из-за Routine generation cannot be deactivated, даже если они мне не нужны в моей программе.

Проблема 1

Jooq понимает некоторые процедуры, такие как таблицы. Я не профессионал с SQL, поэтому я не знаю, почему это происходит, возможно, причина типа возврата процедуры? Код для генерации одной из процедур, в которых есть эта «ошибка»:

CREATE OR REPLACE FUNCTION dblink_get_notify(IN conname text, OUT notify_name text, OUT be_pid integer, OUT extra text)
  RETURNS SETOF record AS
'$libdir/dblink', 'dblink_get_notify'
  LANGUAGE c VOLATILE STRICT
  COST 1
  ROWS 1000;
ALTER FUNCTION dblink_get_notify(text)
  OWNER TO postgres;

Возможно, причина проблемы в том, что существует другая процедура с таким же именем, но без параметра IN:

    CREATE OR REPLACE FUNCTION dblink_get_notify(OUT notify_name text, OUT be_pid integer, OUT extra text)
  RETURNS SETOF record AS
'$libdir/dblink', 'dblink_get_notify'
  LANGUAGE c VOLATILE STRICT
  COST 1
  ROWS 1000;
ALTER FUNCTION dblink_get_notify()
  OWNER TO postgres;

Проблема 2

Некоторые сгенерированные из процедур классы имеют ошибки компиляции (в описанной выше процедуре тоже есть эта ошибка  введите описание изображения здесь )

Приведу еще один пример:

    CREATE OR REPLACE FUNCTION bt_page_stats(IN relname text, IN blkno integer, OUT blkno integer, OUT type "char", OUT live_items integer,
OUT dead_items integer, OUT avg_item_size integer, OUT page_size integer, OUT free_size integer, OUT btpo_prev integer,
OUT btpo_next integer, OUT btpo integer, OUT btpo_flags integer)
  RETURNS record AS '$libdir/pageinspect', 'bt_page_stats'
  LANGUAGE c VOLATILE STRICT
  COST 1;
ALTER FUNCTION bt_page_stats(text, integer)
  OWNER TO postgres;

JOOQ считает эту процедуру рутиной. Но сгенерированный код имеет дважды идентичное поле Parameter<Integer> BLKNO. И что мне показалось странным, так это конструктор этого класса:

/**
 * Create a new routine call instance
 */
public BtPageStats() {
    super("bt_page_stats", Public.PUBLIC);

    addInParameter(RELNAME);
    addInOutParameter(BLKNO);
    addInOutParameter(BLKNO);
    addOutParameter(TYPE);
    addOutParameter(LIVE_ITEMS);
    addOutParameter(DEAD_ITEMS);
    addOutParameter(AVG_ITEM_SIZE);
    addOutParameter(PAGE_SIZE);
    addOutParameter(FREE_SIZE);
    addOutParameter(BTPO_PREV);
    addOutParameter(BTPO_NEXT);
    addOutParameter(BTPO);
    addOutParameter(BTPO_FLAGS);
}

Посмотрите на двойной addOutParameter (BLKNO)!

Ух, думаю, это все. Надеюсь, вы поможете мне с этими проблемами :)


person invis    schedule 16.09.2015    source источник


Ответы (1)


Вы столкнулись с ошибкой # 4055. Начиная с jOOQ 3.6, перегруженные возвращающие табличное значение функции генерируют код, который не компилируется.

Но проблема исходит из процедур Postgres, которые я не могу деактивировать, потому что создание подпрограмм не может быть деактивировано, даже если они мне не нужны в моей программе.

Это правда, но вы можете явно исключить их из генератора кода по имени, например указав:

<excludes>dblink_get_notify|bt_page_stats</excludes>

Более подробную информацию о конфигурации генератора кода можно найти здесь

person Lukas Eder    schedule 16.09.2015
comment
overloaded table-valued functions, да, я видел эту ошибку при поиске в Google, но в проблеме 2 (bt_page_stats) jOOQ понимает это как процедуру, возможно, вы найдете другую ошибку :) - person invis; 17.09.2015
comment
@invis: Ой, интересно, я это пропустил. Есть ли какая-то конкретная причина, по которой вы решили использовать этот синтаксис для параметра IN OUT? Т.е. разделить его как IN blkno / OUT blkno с дважды одинаковым именем? Наверное, в этом причина. Я исследую: github.com/jOOQ/jOOQ/issues/4570 - person Lukas Eder; 17.09.2015
comment
@invis: Хм, а разве это возможно только с LANGUAGE c? - person Lukas Eder; 17.09.2015
comment
Как говорит наш администратор базы данных: bt_page_stats - это функция, созданная из расширения pageinspect. - person invis; 17.09.2015
comment
Ладно, это странно. Что ж, я подозреваю, что jOOQ может просто пропустить те функции, которые он не может сгенерировать по этим причинам ... В pg_catalog есть похожая функция: pg_stat_get_activity. Я подозреваю, что это просто синтаксическая причуда, поскольку функция действительно является функцией с табличным значением, точно так же ... - person Lukas Eder; 17.09.2015
comment
В моем случае jOOQ не генерирует класс для pg_stat_get_activity. Итак, хорошо, я просто исключаю эти две функции db из генератора, и все в порядке. Но есть способы улучшить jOOQ, удачи :) - person invis; 17.09.2015