Java 1.8,Jooq 3.10.3,Postgres 10.1
我创建了获取表参数的Postgres函数。在JOOQ生成代码之后,我试图从Java代码调用函数,但得到了奇怪的异常。
Postgres部分:
CREATE TABLE testtab
(
id integer NOT NULL,
txt character varying,
CONSTRAINT testtab_pkey PRIMARY KEY (id)
);
CREATE OR REPLACE FUNCTION public.testfunc(val testtab)
RETURNS void
LANGUAGE 'plpgsql'
AS //
begin
insert into testtab select * from val;
end;
//;
Java Part(由Jooq codegen生成的TesttabRecord和Testfunc):
try (Connection conn = DriverManager.getConnection(url, userName, password)) {
DSLContext cxt = DSL.using(conn, SQLDialect.POSTGRES);
TesttabRecord r = new TesttabRecord(1, "test");
Testfunc f = new Testfunc();
f.setVal(r);
f.execute(cxt.configuration());
}
获取例外:
2018年1月19日上午10:17:26 org.jooq.tools.JooqLogger警告警告:不是 方言支持:键入类test.db.tables.records.TesttabRecord 方言POSTGRES不支持 org.jooq.exception.SQLDialectNotSupportedException:输入类 方言不支持test.db.tables.records.TesttabRecord 在org.jooq_3.10.3.POSTGRES.debug(未知来源)的POSTGRES org.jooq.impl.DefaultDataType.getDataType(DefaultDataType.java:855) 在 org.jooq.impl.DefaultDataType.getDataType(DefaultDataType.java:799) at org.jooq.impl.DefaultBinding.toSQLCast(DefaultBinding.java:358) 在org.jooq.impl.DefaultBinding.sql(DefaultBinding.java:290)at org.jooq.impl.Val.accept(Val.java:80)at org.jooq.impl.DefaultRenderContext.visit0(DefaultRenderContext.java:415) 在org.jooq.impl.AbstractContext.visit0(AbstractContext.java:423)at org.jooq.impl.AbstractContext.visit(AbstractContext.java:184)at org.jooq.impl.Tools.renderAndBind(Tools.java:1945)at org.jooq.impl.SQLImpl.accept(SQLImpl.java:66)at org.jooq.impl.DefaultRenderContext.visit0(DefaultRenderContext.java:415) 在org.jooq.impl.AbstractContext.visit0(AbstractContext.java:423)at org.jooq.impl.AbstractContext.visit(AbstractContext.java:184)at org.jooq.impl.SQLField.accept(SQLField.java:65)at org.jooq.impl.DefaultRenderContext.visit0(DefaultRenderContext.java:415) 在org.jooq.impl.AbstractContext.visit0(AbstractContext.java:423)at org.jooq.impl.AbstractContext.visit(AbstractContext.java:184)at org.jooq.impl.QueryPartList.accept(QueryPartList.java:101)at org.jooq.impl.DefaultRenderContext.visit0(DefaultRenderContext.java:415) 在org.jooq.impl.AbstractContext.visit0(AbstractContext.java:423)at org.jooq.impl.AbstractContext.visit(AbstractContext.java:184)at org.jooq.impl.Function.toSQLArguments1(Function.java:445)at org.jooq.impl.Function.toSQLArguments0(Function.java:427)at at org.jooq.impl.Function.toSQLArguments(Function.java:422)at org.jooq.impl.Function.accept(Function.java:226)at org.jooq.impl.DefaultRenderContext.visit0(DefaultRenderContext.java:415) 在org.jooq.impl.AbstractContext.visit0(AbstractContext.java:423)at org.jooq.impl.AbstractContext.visit(AbstractContext.java:184)at org.jooq.impl.AbstractRoutine $ RoutineField.accept(AbstractRoutine.java:1635) 在 org.jooq.impl.DefaultRenderContext.visit0(DefaultRenderContext.java:415) 在org.jooq.impl.AbstractContext.visit0(AbstractContext.java:423)at org.jooq.impl.AbstractContext.visit(AbstractContext.java:184)at org.jooq.impl.Tools.renderAndBind(Tools.java:1945)at org.jooq.impl.SQLImpl.accept(SQLImpl.java:66)at org.jooq.impl.DefaultRenderContext.visit0(DefaultRenderContext.java:415) 在org.jooq.impl.AbstractContext.visit0(AbstractContext.java:423)at org.jooq.impl.AbstractContext.visit(AbstractContext.java:184)at org.jooq.impl.SQLTable.accept(SQLTable.java:82)at org.jooq.impl.DefaultRenderContext.visit0(DefaultRenderContext.java:415) 在org.jooq.impl.AbstractContext.visit0(AbstractContext.java:394)at org.jooq.impl.AbstractContext.visit(AbstractContext.java:184)at org.jooq.impl.QueryPartList.accept(QueryPartList.java:101)at org.jooq.impl.DefaultRenderContext.visit0(DefaultRenderContext.java:415) 在org.jooq.impl.AbstractContext.visit0(AbstractContext.java:423)at org.jooq.impl.AbstractContext.visit(AbstractContext.java:184)at org.jooq.impl.SelectQueryImpl.toSQLReference0(SelectQueryImpl.java:1190) 在 org.jooq.impl.SelectQueryImpl.toSQLReference0(SelectQueryImpl.java:978) 在 org.jooq.impl.SelectQueryImpl.toSQLReferenceLimitDefault(SelectQueryImpl.java:771) 在org.jooq.impl.SelectQueryImpl.accept(SelectQueryImpl.java:604)at at org.jooq.impl.DefaultRenderContext.visit0(DefaultRenderContext.java:415) 在org.jooq.impl.AbstractContext.visit0(AbstractContext.java:423)at org.jooq.impl.AbstractContext.visit(AbstractContext.java:184)at org.jooq.impl.AbstractQuery.getSQL0(AbstractQuery.java:498)at org.jooq.impl.AbstractQuery.execute(AbstractQuery.java:306)at org.jooq.impl.AbstractResultQuery.fetch(AbstractResultQuery.java:317) 在org.jooq.impl.SelectImpl.fetch(SelectImpl.java:2597)at org.jooq.impl.AbstractRoutine.executeSelectFromPOSTGRES(AbstractRoutine.java:433) 在org.jooq.impl.AbstractRoutine.execute(AbstractRoutine.java:335) 在org.jooq.impl.AbstractRoutine.execute(AbstractRoutine.java:317)
上面的代码出了什么问题?我会感激任何建议。
答案 0 :(得分:1)
这是一个错误/缺失的功能:https://github.com/jOOQ/jOOQ/issues/7174
目前(jOOQ 3.10)没有好的解决方法,没有超载功能并通过以下任何一个:
CREATE TYPE
)你的职能部门也有一个小问题:
CREATE OR REPLACE FUNCTION public.testfunc(val testtab)
RETURNS void
LANGUAGE 'plpgsql'
AS //
BEGIN
INSERT INTO testtab VALUES (val.*); -- You cannot use val in FROM
END;
//;
答案 1 :(得分:0)
应生成Routines
类,其中应包括您的例行程序。在那里你会找到它需要的参数。