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

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

现在我尝试在新版本的程序中使用 JOOQ 同时与 2 个数据库通信。但问题来自 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 field 。我发现奇怪是该类的构造函数:

/**
 * 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)!

哇,我想就这些了。希望你能帮助我解决这个问题:)

最佳答案

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

But problem is coming from Postgres procedures which I cant deactivate cause of Routine generation cannot be deactivated, even if I don't need them in my program.

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

<excludes>dblink_get_notify|bt_page_stats</excludes>

More info about the code generator configuration can be found here

关于stored-procedures - jooq 从 Postgres 过程生成未编译的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32614606/

相关文章:

java - 如何按属性对对象列表进行分组,然后使用(键,值)对迭代结果?

Java 8 - 带有对象和原始包装器的流

java - Jooq 插入重复键更新

mysql - 当语句中有 'No data - zero rows fetched, selected, or processed' 时,为什么我的存储过程会抛出错误 "WHERE"?

java - 是否有可能获得在数据库包中声明的常量值? (SQL 或 Java)

SQL 比较每小时总订单并删除当前库存可能吗?

带有明细表和事务的 MySQL 存储过程

java - 十六进制编辑 Java 字节码抛出 ClassFormatError

java - 通用类型不兼容

java - 有没有办法在 jOOQ 中检查查询绑定(bind)值?