java - 如何使用 java 中的一个或多个 INOUT 参数调用 postres 过程
问题描述
postgresql 11中有一个存储过程:
CREATE OR REPLACE PROCEDURE clone_ad (
p_src_ad_id BIGINT,
p_ad_def_id BIGINT,
p_user_id BIGINT,
p_dst_ad_id INOUT BIGINT)
AS ...
它工作得很好,但我不能从我的java代码中调用它:-(
我有 postgresql 11 和 java 8。我尝试了两个 postgres jdbc 驱动程序 org.postgresql:postgresql:42.2.5 和 postgresql:postgresql:9.1-901-1.jdbc4 结果是一样的
当我使用
stmt = conn.prepareCall("{ call clone_ad(?, ?, ?, ?)}");
stmt.setLong(1,1L);
stmt.setLong(2,1000L);
stmt.setLong(3,999L);
stmt.setObject(4,null, Types.BIGINT);
stmt.registerOutParameter(4, Types.BIGINT);
boolean hadResults = stmt.execute();
java throws: org.postgresql.util.PSQLException: ERROR: clone_ad(bigint, bigint, bigint, bigint) 是一个过程 提示:要调用一个过程,请使用 CALL。
当我使用
stmt = conn.prepareCall("call clone_ad(?, ?, ?, ?)");
stmt.setLong(1,1L);
stmt.setLong(2,1000L);
stmt.setLong(3,999L);
stmt.setObject(4,null, Types.BIGINT);
stmt.registerOutParameter(4, Types.BIGINT);
boolean hadResults = stmt.execute();
java throws: org.postgresql.util.PSQLException: 此语句未声明 OUT 参数。使用 { ?= call ... } 来声明一个。
我期望调用另一个没有 INOUT 参数的过程。
有什么建议吗?
解决方案
jdbc 驱动程序包含错误但不能轻易修复,因为它破坏了向后兼容性:-(
推荐阅读
- glsl - 用于无绑定使用的 GLSL 中的 Sampler2D 纹理数组
- html - 我可以以某种方式更改要显示的表格的顺序吗?
- database - Grails 应用程序中特定表条目的详细信息
- go - 为什么 pprof heap inuse_space 小于 container_working_set_size?
- node.js - Mkcert 在 Node docker 容器上生成 rootCA,Browsersync over https 不安全
- php - 使用 fsockopen 连接到在另一个 PHP 实例中打开的监听端口
- shopify-app - Shopify 节点应用未显示应用嵌入主题设置
- javascript - 发送邮件时保留文本区域的换行符
- jsf - JSF 和 Bootstrap5
- c# - C# 从 IQueryCollection 读取数组