2 回答
TA贡献1852条经验 获得超1个赞
由于 pgJDBC 42.2.5 是在 PostgreSQL 11 版本(2018 年 10 月)之前(2018 年 8 月)发布的,我认为这目前是 PostgreSQL 本身的 JDBC 驱动程序中的一个问题。我在 GitHub 存储库中创建了一个问题。
对于解决方法,您可以将其重写STORED PROCEDURE为 aFUNCTION并使用@NamedStoredProcedureQuery或直接与 JDBC 交互,CallableStatement例如:
Connection conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/", "postgres", "postgres");
CallableStatement callableStatement = conn.prepareCall("{call f_raise_wage_employee_older_than(?,?)}");
callableStatement.setInt(1, 20);
callableStatement.setInt(2, 500);
callableStatement.executeUpdate();
或使用以下命令执行本机查询EntityManager:
this.em.createNativeQuery("CALL p_raise_wage_employee_older_than(1, 20)");
一旦我从 pgJDBC 维护者那里得到答案,我就会更新这个答案。
更新:
这个话题已经在 Postgres 邮件列表(https://www.postgresql.org/message-id/4285.1537201440%40sss.pgh.pa.us)中讨论过,目前没有解决方案。唯一的方法是将本地 SQL 查询传递给数据库或重写STORED PROCEDURE为FUNCTION
TA贡献1887条经验 获得超5个赞
在 PostgreSQL 11 之后,PostgreSQL JDBC 驱动团队EscapeSyntaxCallMode
在 PostgreSQL 驱动版本 42.2.16 中引入了一个 ENUM 名称。所以我们可以在创建数据库连接或创建 DataSource 对象时使用这个枚举。这个枚举有 3 种类型的值:
"
func
" - 当我们总是想调用函数时设置它。"
call
" - 当我们总是想调用程序时设置它。"
callIfNoReturn
" - 它检查调用函数/过程中的返回类型,如果返回类型存在 PostgreSQL 将其视为函数并将其作为函数方式调用。否则将其称为过程方式。所以在我的项目中我使用了这个“callIfNoReturn
”,因为我希望 PostgreSQL 自动检测我是在调用函数还是过程。
添加回答
举报