【 使用环境 】测试环境
【 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