INSERT语句报4016错误是什么原因?

【 使用环境 】生产环境 or 测试环境
【 OB or 其他组件 】
【 使用版本 】OBODBC最新版
【问题描述】INSERT语句报4016错误
【复现路径】
【问题现象及影响】

INSERT INTO table ( … ) VALUES ( ?, …, ? );
参数有字符串有整数。

直接使用MySQL 5.x驱动没有问题。

【附件】

你好,麻烦提供一下具体的sql语句(包括创建表格、insert语句、其他ddl语句)、报错截图和错误日志

表和字段类型都没啥特殊的,自己测一下就知道了,用SQLBindParameter,SQL_C_CHAR,SQL_CHAR。

还有,SQLRowCount也不靠谱,INSERT成功了,它可能报0,可能报非0。

请问是用的哪个版本的observer和obodbc呢?我们针对具体版本分析一下。另外如果有错误日志麻烦贴一下,方便我们对比。谢谢!

都是官网最新的,我刚下载了准备做兼容性测试,就发现一堆问题。

日志是我们自己的,对你们应该没什么参考价值。

建CHAR、VARCHAR字段,用SQL_C_CHAR和SQL_CHAR绑定参数。

这个属于企业版的问题,可以联系跟贵公司对接的技术支持人员协助排查问题。或者在官网上提交工单,我们也会有技术人员跟进处理。
OceanBase工单系统使用(用户手册).pdf (1.1 MB)

我们使用的是社区版,日志:

  • 2023-02-14_10:45:21.904904 NEW CYCLE - Execute String: SQLSTATE=[HY000], Native=[4016], Msg=[[ma-2.0.6][5.7.25]Internal error]

其中标签NEW CYCLE是一个简单的INSERT INTO … VALUES (…)语句,参数是整数和字符串,使用SQL_C_CHAR和SQL_CHAR。

SQLGetInfo:
SQL_DBMS_NAME=Oracle
SQL_DBMS_VER=05.07.000025
SQL_DRIVER_NAME=libmaodbc.so
SQL_DRIVER_VER=02.0.006.0

Oceanbase_CE 4.0.0.0 (r103000022023011215-05bbad0279302d7274e1bfab79323a2C915c1981) (Built Jan 12 2023 15:28:27)

OceanBase社区版是不支持Oracle模式的,不知道这里SQL_DBMS_NAME=Oracle是不是真的用了Oracle,这个是用不了的。社区版直接使用mysql的驱动即可,不需要用obodbc。企业版如果是Oracle模式,才需要使用obodbc驱动。

这是另一个BUG,报告在这里:

找到问题了,大概是因为Bind的时候,用的是变量(字段)的定义长度,而不是变量值的长度。

两段程序,用参数值长度bind的,操作能成功,但是用变量长度bind的,就报4016错误。
对于重复使用的SQL来说,尤其是prepare的,一次bind,多次execute,显然是常见的场景。
需要多次execute的SQL,显然是无法预先用值长度bind的,只能用变量长度bind。

另外,SQLRowCount的问题也需要解决一下,不能返回INSERT/UPDATE/DELETE的记录数。