Stored procedures jooq从Postgres过程生成未编译的代码

Stored procedures jooq从Postgres过程生成未编译的代码,stored-procedures,java-8,jooq,postgresql-9.4,Stored Procedures,Java 8,Jooq,Postgresql 9.4,现在我正在尝试在新版本的程序中使用JOOQ,它可以同时与2个DBs通信。但问题来自于我不能停用的Postgres程序,因为例程生成无法停用,即使我的程序中不需要它们 问题1 Jooq了解一些类似于表格的程序。我不支持SQL,所以我不知道为什么会发生这种情况,可能是过程返回类型的原因?生成一个有此错误的过程的代码: CREATE OR REPLACE FUNCTION dblink_get_notify(IN conname text, OUT notify_name text, OUT be_p

现在我正在尝试在新版本的程序中使用JOOQ,它可以同时与2个DBs通信。但问题来自于我不能停用的Postgres程序,因为例程生成无法停用,即使我的程序中不需要它们

问题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将此程序理解为例行程序。但生成的代码具有相同的双参数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);
}
看看double AddOutputParameterBlkno

哦,我想就这些。希望您能帮助我解决这些问题:

您遇到了bug。从JOOQ3.6开始,重载的表值函数会生成无法编译的代码

但问题来自于我不能停用的Postgres程序,因为例程生成无法停用,即使我的程序中不需要它们

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

<excludes>dblink_get_notify|bt_page_stats</excludes>

重载表值函数,是的,我在谷歌搜索时看到了这个bug,但在问题2 bt_page_stats中,jOOQ将其理解为一个常规,也许你会发现另一个bug:@invi:噢,有趣,我错过了。您选择对IN-OUT参数使用该语法有什么具体原因吗?也就是说,以两倍于同一名称的方式将其分隔为IN-blkno/OUT-blkno?这可能就是原因。我会调查:@invi:Hmm,这可能只有用c语言才能实现吗?正如我们的DBA所说:bt_page_stats是一个从pageinspect扩展生成的函数。好吧,这很奇怪。好吧,我怀疑jOOQ可能会跳过那些由于这些原因而无法生成的函数。。。pg_目录中有一个类似的函数:pg_stat_get_活动。我怀疑这只是一些语法上的怪癖,因为这个函数实际上是一个表值函数,同样。。。