prepareStatement(sql, new String[]{"id"})执行INSERT报错与数据库报错不同

【 使用环境 】测试环境
【 OB or 其他组件 】Database:3.2.3.3, Driver:Oceanbase Connector/J 2.4.17,Oracle 兼容模式
【 使用版本 】
【问题描述】使用prepareStatement(sql, new String[]{“id”})执行INSERT,触发唯一索引冲突 ORA-00001;
未抛出SQLIntegrityConstraintViolationException,而是抛出ArrayIndexOutOfBoundsException;
【复现路径】创建表,id为自增主键,三列作为一个元组来组成唯一键,连续插入两条相同的数据,第一次正常插入,第二条数据触发唯一性约束,数据库执行报错唯一索引冲突,java程序执行报OutOfIndex
【附件及日志】
建表语句:
CREATE TABLE config_info (
id NUMBER(20) GENERATED BY DEFAULT AS IDENTITY,
data_id VARCHAR2(255) NOT NULL,
group_id VARCHAR2(128) NOT NULL,
tenant_id VARCHAR2(128) DEFAULT ‘’,
app_name VARCHAR2(128),
content CLOB,
md5 VARCHAR2(32) DEFAULT NULL,
gmt_create TIMESTAMP NOT NULL DEFAULT SYSTIMESTAMP,
gmt_modified TIMESTAMP NOT NULL DEFAULT SYSTIMESTAMP,
src_user VARCHAR2(128) DEFAULT NULL,
src_ip VARCHAR2(50) DEFAULT NULL,
c_desc VARCHAR2(256) DEFAULT NULL,
c_use VARCHAR2(64) DEFAULT NULL,
effect VARCHAR2(64) DEFAULT NULL,
type VARCHAR2(64) DEFAULT NULL,
c_schema CLOB DEFAULT NULL,
encrypted_data_key VARCHAR2(1024) DEFAULT NULL,
CONSTRAINT configinfo_id_key PRIMARY KEY (id),
CONSTRAINT uk_configinfo_datagrouptenant UNIQUE (data_id, group_id, tenant_id)
);

CREATE INDEX configinfo_dataid_key_idx ON config_info(data_id);
CREATE INDEX configinfo_groupid_key_idx ON config_info(group_id);
CREATE INDEX configinfo_dataid_group_key_idx ON config_info(data_id, group_id);

测试的两种插入的报错:
[D dup via new String[]{“id”}] → threw java.lang.ArrayIndexOutOfBoundsException: Index 256 out of bounds for length 129

[E dup via plain prepareStatement] → threw java.sql.SQLIntegrityConstraintViolationException: (conn=2098235) ORA-00001:
unique constraint ‘ob-gk-probe-test-DEFAULT_GROUP-testjdk21’ for key ‘UK_CONFIGINFO_DATAGROUPTENANT’ violated
cause: com.oceanbase.jdbc.internal.util.exceptions.OceanBaseSqlException: ORA-00001:
unique constraint ‘ob-gk-probe-test-DEFAULT_GROUP-testjdk21’ for key ‘UK_CONFIGINFO_DATAGROUPTENANT’ violated

5 个赞

@论坛小助手

您好,您提的这个技术问题可能牵涉到 OceanBase 企业版范围内的功能细节;针对此类问题,建议你通过以下方式寻求帮助:

  1. 如你所在的企业客户已签署 OceanBase 企业版销售合同,请你联系客户经理;

  2. 如你所在的企业客户尚未签署 OceanBase 企业版销售合同,你可通过OceanBase官网商务咨询页面留下你的联系方式,OceanBase企业版的业务顾问会在一个工作日内与你联系。

另外,我们欢迎你使用社区版,并在论坛/社群中分享你对社区版本的想法、经验和问题,与其他社区成员共同交流。

3 个赞

厉害了

1 个赞

OceanBase 企业版可以找客服寻求技术支持。

1 个赞

详细