使用Oceanbase数据库Oracle模式,版本号为4.2.1.8,驱动版本号为2.4.11,使用oceanbase数据库适配nacos中间件,向nacos配置表插入数据时会报错Parameter at position 15 is not set,发现是insert语句后拼接了returning id into ?,最后一个参数找不到引发的报错,请问如何解决。
您好,您提的这个技术问题可能牵涉到 OceanBase 企业版范围内的功能细节;针对此类问题,建议你通过以下方式寻求帮助:
-
如你所在的企业客户已签署 OceanBase 企业版销售合同,请你联系客户经理;
-
如你所在的企业客户尚未签署 OceanBase 企业版销售合同,你可通过OceanBase官网商务咨询页面留下你的联系方式,OceanBase企业版的业务顾问会在一个工作日内与你联系。
另外,我们欢迎你使用社区版,并在论坛/社群中分享你对社区版本的想法、经验和问题,与其他社区成员共同交流。
jdbc连接串和完整的insert贴一下呢,通过grep 1186426 obproxy.log查看一下日志输出信息或是直接根据报错时间点过滤一下obproxy_error.log
方案一:修改 NACOS 中间件源码或 SQL 构造逻辑
找到拼接 insert ... returning id into ? 的位置;
修改为使用标准 JDBC 获取自增主键的方式,例如:
PreparedStatement ps = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
ps.executeUpdate();
ResultSet rs = ps.getGeneratedKeys();
但这个方案的前提是你能改源码。如果你使用的是开源 NACOS 并且能编译部署,那是最推荐的。
方案二:升级 OceanBase JDBC 驱动(如果已修复)
OceanBase 社区有在逐步增强对 Oracle 模式下 RETURNING 语法的 JDBC 支持,你用的 2.4.11 驱动可能没有完全支持绑定 OUT 参数的能力。
建议去官方 GitHub 或 Maven 中查看是否有更新版本(比如 obclient-jdbc)。
方案三:使用兼容性 SQL,避免使用 RETURNING INTO
可以将 NACOS 初始化表结构、插入逻辑中涉及到 returning into 的部分改为两步:
– 原来的 SQL
INSERT INTO config_info (id, …) VALUES (seq_config.nextval, …) RETURNING id INTO ?;
– 改为两步
SELECT seq_config.nextval INTO :id FROM dual;
INSERT INTO config_info (id, …) VALUES (:id, …);
或者通过触发器自动生成 ID,避免客户端关注 ID 返回。
方案四:临时兼容,绑定一个占位参数(不推荐但可试)
在连接驱动中尝试主动设置参数 15 为 null 或注册为 OUT 参数,绕过语法问题,但这需要你能修改数据访问层代码。
ps.registerOutParameter(15, java.sql.Types.INTEGER); // 模拟 returning id into ?
如果 NACOS 采用的是通用 SQL 执行组件(如 MyBatis),这个也许能通过插件方式打 patch。
学习总结经验
技术盲点
首先谢谢你的回答,后边又耐心看了一下oceanbase-client中的源码,源码中useOraclePrepareExecute参数是false,我在数据库链接中将这个参数改为了true可以了,开启了二合一协议。