jooq从Postgres程序生成未编译的代码

时间:2015-09-16 17:03:14

标签: stored-procedures java-8 jooq postgresql-9.4

现在我正在尝试在同时与2个DB通信的新版程序中使用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

来自过程的一些生成的类具有编译错误(上面的过程也有此错误enter image description here

我会再给你一个例子:

    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字段。而我发现 strange 是该类的构造函数:

/**
 * 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);
}

看看double addOutParameter(BLKNO)!

哇,哇,这就是全部。希望你能帮我解决这个问题:)

1 个答案:

答案 0 :(得分:4)

你遇到了错误#4055。从jOOQ 3.6开始,重载的表值函数生成无法编译的代码。

  

但问题来自Postgres程序,我无法停用常规代的原因无法停用,即使我在程序中不需要它们。

这是真的,但您可以通过名称明确地将它们从代码生成器中排除,例如通过指定:

<excludes>dblink_get_notify|bt_page_stats</excludes>

More info about the code generator configuration can be found here