---
title: 数据迁移报错 ORA-14400 inserted partition key does not map to any partition-OceanBase数据库使用指南
description: 了解OceanBase数据库在实际应用中关于数据迁移报错 ORA-14400 inserted partition key does not map to any partition相关的常见问题和使用技巧，帮助您快速解决数据迁移报错 ORA-14400 inserted partition key does not map to any partition的难题。
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

划线反馈

# 数据迁移报错 ORA-14400 inserted partition key does not map to any partition

更新时间：2026-06-23 08:06

适用版本： V4.2.x、V4.1.x、V4.0.x、V3.4.x、V3.3.x、V3.2.x、V3.1.x 内容类型：Troubleshoot  

本文为您介绍数据迁移时报错 ORA-14400 的可能原因和解决方法。

## 适用版本

适用于 OceanBase 数据库 V2.x 和 V3.x，以及 OceanBase 迁移服务（OceanBase Migration Service，OMS）V3.x 和 V4.x。

## 问题描述

使用 OMS 进行全量迁移或增量同步时，出现报错 `ORA-14400：inserted partition key does not map to any partition`。

## 问题原因

- 可能原因一：

  在 Oracle 数据库中，建表 DDL 包含函数的部分会保留原命令，但实际使用时，是创建时已经转换的结果。

  ```sql
  SQL> alter session set nls_date_format='DD-MON-RR';
  Session altered.
  SQL> insert into T1 values (1,'01-MON-2023');
  insert into T1 values (1,'01-MON-2023')

  ERROR at line 1:
  ORA-14400: inserted partition key does not map to any partition

  ```

  在 OceanBase 数据库中，建表 DDL 语句包含函数的部分，会直接显示为转换后的 DDL 语句。
 - 可能原因二：

  间隔（interval）分区是 Oracle 数据库的一个特性，使用间隔分区技术后，数据库能根据数据自动创建相关的分区。目前 OceanBase 数据库并不支持该功能。 ​ OMS 在结构迁移期间，会将启用间隔分区特性的表作为普通表处理，仅会迁移该类表现有的分区至目标端。因此，结构迁移完成后，源端 Oracle 数据库新生成的分区在目标端 OceanBase 数据库中并不存在，相应的数据同步到 OceanBase 数据库后将引发 ORA-14400 报错。
 - 可能原因三：

  生产环境中，有一部分特殊数据存放于分区表中，但分区字段是 NULL 值。通常该部分数据会存放在一个 ”MAX“ 分区中，Oracle 数据库和 OceanBase 数据库 Oracle 租户均支持该操作。语法定义示例如下：

  ```sql
  PARTITION "PMAX"  VALUES LESS THAN (MAXVALUE)

  ```

  和 Oracle 数据库不同，OceanBase 数据库强制要求主键必须包含分区键。较早的 OMS 版本中，OMS 会直接修改 OceanBase 数据库的表结构，将分区键加入主键中，主键默认具备非空属性。该行为导致分区键为 NULL 的记录无法插入，从而导致 ORA-14400 报错。后来的 OMS 版本将此类表修改为无主键表，无主键允许分区字段为空，能够兼容该部分生产数据。‘

  OMS 是否存在将分区字段强制加入主键的行为取决于 DBCat 组件的版本。

     - OMS 3.4.0-BP1 默认自带的 DBCat 组件仍然采用将分区键强制加入主键的策略。

      ```shell
      SHELL> jar tvf  /home/ds/ghana/boot/Ghana-endpoint-1.0.0-executable.jar.old|grep dbdif
      1379058 Wed Nov 16 09:05:02 CST 2022 BOOT-INF/lib/obtools-dbdiff-1.8.0-SNAPSHOT.jar

      ```
     - DBCat 组件升级至 V1.9.1 后，分区键不再强制加入主键。

      ```shell
      SHELL> jar tvf  /home/ds/ghana/boot/Ghana-endpoint-1.0.0-executable.jar|grep dbdif
      1440173 Tue Apr 25 05:57:48 CST 2023 BOOT-INF/lib/obtools-dbdiff-1.9.1-RELEASE.jar

      ```

## 解决方法

### 可能原因一的解决方法

该场景适用于 OMS V3.x 和 V4.x。

1. 开始进行数据迁移前，在 OceanBase 数据库设置全局的 `nls_date_format='yyyy-mm-dd HH24:MI:SS`，以保持和应用一致。
 2. 在同步 DDL 时，手动创建表。

### 可能原因二的解决方法

该场景适用于 OceanBase 数据库 V2.x 和 V3.x。临时解决方法如下：

1. 您可以在 Oracle 数据库查询表结构定义，确认报错的表是否使用间隔分区特性。此处为一个使用间隔分区的示例，该表关键字 "INTERVAL (NUMTOYMINTERVAL(1, 'MONTH')"。

   ```sql
   SQL>SELECT dbms_metadata.get_ddl('TABLE','SP_BPM_INST','NGCRM_XX') str FROM dual;

   ```

   **STR**

   ```sql
   CREATE TABLE "NGCRM_XX"."SP_BPM_INST"
   (   "WKFINSTID" VARCHAR2(100) NOT NULL ENABLE,
       "WORKFLOWID" VARCHAR2(100) NOT NULL ENABLE,
       "STATE" VARCHAR2(16) NOT NULL ENABLE,
       "STATEDATE" DATE NOT NULL ENABLE,
       "REGION" NUMBER(5,0) NOT NULL ENABLE,
       "INSTCREATEDATE" DATE NOT NULL ENABLE,
        CONSTRAINT "PK_SP_BPM_INST" PRIMARY KEY ("WKFINSTID") USING INDEX  ENABLE,
        SUPPLEMENTAL LOG DATA (ALL) COLUMNS
   )
   PARTITION BY RANGE ("INSTCREATEDATE") INTERVAL (NUMTOYMINTERVAL(1, 'MONTH'))
   (PARTITION "P_OLD"  VALUES LESS THAN (TO_DATE(' 2022-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) ) ;

   ```
 2. 对于间隔分区的表，您无法直接从 DDL 获取其分区定义，可以通过下述语句进行查询。

   ```sql
   SQL> SELECT PARTITION_NAME,HIGH_VALUE FROM dba_tab_partitions WHERE table_owner='NGCRM_XX' AND table_name='SP_BPM_INST' ORDER BY PARTITION_POSITION;

   ```

   查询结果如下：

   ```shell
   PARTITION_NAME                 HIGH_VALUE
   ------------------------------ ------------------------------------------------------------------------------------------------------------------------
   P_OLD                          TO_DATE(' 2022-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
   SYS_P8336                      TO_DATE(' 2022-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
   SYS_P9113                      TO_DATE(' 2022-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
   SYS_P10092                     TO_DATE(' 2022-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
   SYS_P10692                     TO_DATE(' 2022-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
   SYS_P11192                     TO_DATE(' 2022-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
   SYS_P11961                     TO_DATE(' 2022-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
   SYS_P12861                     TO_DATE(' 2023-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
   SYS_P14497                     TO_DATE(' 2023-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
   SYS_P15461                     TO_DATE(' 2023-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
   SYS_P16401                     TO_DATE(' 2023-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
   SYS_P17421                     TO_DATE(' 2023-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
   SYS_P18281                     TO_DATE(' 2023-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
   SYS_P19181                     TO_DATE(' 2023-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
   SYS_P1081                      TO_DATE(' 2023-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')

   ```
 3. 比较 OceanBase 数据库的表结构，确认是否存在差异。此处能看到缺失 SYS_P1081 分区。

   ```sql
   CREATE TABLE "SP_BPM_INST" (
     "WKFINSTID" VARCHAR2(100) CONSTRAINT "SP_BPM_INST_OBNOTNULL_1688141489590079" NOT NULL ENABLE,
     "WORKFLOWID" VARCHAR2(100) CONSTRAINT "SP_BPM_INST_OBNOTNULL_1688141489590091" NOT NULL ENABLE,
     "STATE" VARCHAR2(16) CONSTRAINT "SP_BPM_INST_OBNOTNULL_1688141489590096" NOT NULL ENABLE,
     "STATEDATE" DATE CONSTRAINT "SP_BPM_INST_OBNOTNULL_1688141489590099" NOT NULL ENABLE,
     "REGION" NUMBER(5) CONSTRAINT "SP_BPM_INST_OBNOTNULL_1688141489590103" NOT NULL ENABLE,
     "INSTCREATEDATE" DATE CONSTRAINT "SP_BPM_INST_OBNOTNULL_1688141489590107" NOT NULL ENABLE,
     "OMS_OBJECT_NUMBER" NUMBER INVISIBLE,
     "OMS_RELATIVE_FNO" NUMBER INVISIBLE,
     "OMS_BLOCK_NUMBER" NUMBER INVISIBLE,
     "OMS_ROW_NUMBER" NUMBER INVISIBLE,
     CONSTRAINT "PK_SP_BPM_INST" PRIMARY KEY ("WKFINSTID", "INSTCREATEDATE"),
     CONSTRAINT "UK_SP_BPM_INST_OMS_ROWID" UNIQUE ("OMS_OBJECT_NUMBER", "OMS_RELATIVE_FNO", "OMS_BLOCK_NUMBER", "OMS_ROW_NUMBER", "INSTCREATEDATE") USING INDEX LOCAL
   ) COMPRESS FOR ARCHIVE REPLICA_NUM = 3 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0
   partition by range("INSTCREATEDATE")
   (partition P_OLD values less than (TO_DATE(' 2022-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
   partition SYS_P8336 values less than (TO_DATE(' 2022-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
   partition SYS_P9113 values less than (TO_DATE(' 2022-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
   partition SYS_P10092 values less than (TO_DATE(' 2022-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
   partition SYS_P10692 values less than (TO_DATE(' 2022-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
   partition SYS_P11192 values less than (TO_DATE(' 2022-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
   partition SYS_P11961 values less than (TO_DATE(' 2022-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
   partition SYS_P12861 values less than (TO_DATE(' 2023-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
   partition SYS_P14497 values less than (TO_DATE(' 2023-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
   partition SYS_P15461 values less than (TO_DATE(' 2023-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
   partition SYS_P16401 values less than (TO_DATE(' 2023-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
   partition SYS_P17421 values less than (TO_DATE(' 2023-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
   partition SYS_P18281 values less than (TO_DATE(' 2023-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
   partition SYS_P19181 values less than (TO_DATE(' 2023-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')))

   ```
 4. 根据需要补充对应分区（请注意分区名称不同）。

   ```sql
   ALTER TABLE NGCRM_XX.SP_BPM_INST ADD PARTITION "SYS_P1081" VALUES LESS THAN (TO_DATE(' 2023-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'));

   ```
 5. 恢复数据迁移项目。

长远解决方法如下：

1. 开始进行数据迁移前，您可以通过下述语句排查 Oracle 数据库中是否存在间隔分区。

   ```sql

   SELECT DISTINCT tab FROM (
   SELECT  table_owner||'.'||table_name tab
   FROM dba_tab_partitions
   WHERE  INTERVAL='YES' AND table_owner NOT IN ('SYS','AUDSYS')
   UNION ALL
   SELECT DISTINCT table_owner||'.'||table_name tab
   FROM dba_tab_subpartitions
   WHERE  INTERVAL='YES'
   );

   ```
 2. 协调业务侧提前对相应的间隔分区进行 DML 操作，提前生成相应的分区（可以提前半年至一年创建）。请注意数据会被回滚，并不会产生实际生产的数据。

   ```sql
   INSERT INTO "NGCRM_XX"."SP_BPM_INST" VALUES('Delte_Me_01','Delete ME','Delete ME',to_date('2023-08-02','yyyy-mm-dd'),0,to_date('2023-08-02','yyyy-mm-dd'));
   INSERT INTO "NGCRM_XX"."SP_BPM_INST" VALUES('Delte_Me_02','Delete ME','Delete ME',to_date('2023-09-02','yyyy-mm-dd'),0,to_date('2023-09-02','yyyy-mm-dd'));
   INSERT INTO "NGCRM_XX"."SP_BPM_INST" VALUES('Delte_Me_03','Delete ME','Delete ME',to_date('2023-10-02','yyyy-mm-dd'),0,to_date('2023-10-02','yyyy-mm-dd'));
   INSERT INTO "NGCRM_XX"."SP_BPM_INST" VALUES('Delte_Me_04','Delete ME','Delete ME',to_date('2023-11-02','yyyy-mm-dd'),0,to_date('2023-11-02','yyyy-mm-dd'));
   INSERT INTO "NGCRM_XX"."SP_BPM_INST" VALUES('Delte_Me_05','Delete ME','Delete ME',to_date('2023-12-02','yyyy-mm-dd'),0,to_date('2023-12-02','yyyy-mm-dd'));
   ROLLBACK;

   ```

   如果业务侧不同意相关方案，您可以直接在 OceanBase 数据库进行变更，提前创建对应的分区。但这种方式无法保持 Oracle 数据库和 OceanBase 数据库分区名称的一致性。

   ```sql
   ALTER TABLE NGCRM_XX.SP_BPM_INST ADD PARTITION "P202308" VALUES LESS THAN (TO_DATE(' 2023-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'));
   ALTER TABLE NGCRM_XX.SP_BPM_INST ADD PARTITION "P202309" VALUES LESS THAN (TO_DATE(' 2023-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'));
   ALTER TABLE NGCRM_XX.SP_BPM_INST ADD PARTITION "P202310" VALUES LESS THAN (TO_DATE(' 2023-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'));
   ALTER TABLE NGCRM_XX.SP_BPM_INST ADD PARTITION "P202311" VALUES LESS THAN (TO_DATE(' 2023-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'));
   ALTER TABLE NGCRM_XX.SP_BPM_INST ADD PARTITION "P202312" VALUES LESS THAN (TO_DATE(' 2024-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'));

   ```

### 可能原因三的解决方法

该场景适用于 OMS 3.x 版本。

1. 分别检查源端 Oracle 数据库和目标端 OceanBase 数据库的表结构，确认是否存在目标端强行修改主键导致分区字段存在非空属性的情况。
 2. 检查源端 Oracle 数据库是否存在分区字段为 NULL 的记录。
 3. 检查 DBCat 版本，确认是否存在自动转换分区键的逻辑。您可以自行创建一张测试表进行验证。
 4. 如果确实是由于 DBCat 版本过低导致的该问题，请升级 DBCat 组件的版本。
 5. 重新同步相关的表。

您需要注意以下问题：

- OceanBase 数据库的无主键表性能较差，源端 Oracle 数据库的主键值不包含分区字段的表，需要根据实际情况来决定应该将其转换为无主键表，还是将分区字段加入主键。
 - 目前 OceanBase 数据库仅支持通过无主键表形式存放分区键为空的记录。如果您需要将分区键加入主键，请协调修改数据，并进行应用层改造，避免空值分区键写入。
 - DBCat 版本对表结构转换具备较大影响。在部署的新环境创建数据同步项目前，请务必确认 DBCat 组件的版本，避免无法进行数据同步。

​例如，下述为 Oracle 数据库原始的表结构，您可以看到主键为 `LOG_ID`。

```sql
OBTEST1>select dbms_metadata.get_ddl('TABLE','IB_WL_BILLTABLOG','XXIB') STR from dual;
STR: CREATE TABLE "XXIB"."IB_WL_BILLTABLOG"
   (    "LOGID" NUMBER(14,0) NOT NULL ENABLE,
        "VALIDBILLCYC" NUMBER(8,0) NOT NULL ENABLE,
        "EBOXID" NUMBER(14,0) NOT NULL ENABLE,
        "SUBSID" NUMBER(14,0) NOT NULL ENABLE,
        "CUSTID" NUMBER(14,0) NOT NULL ENABLE,
        "PRINTTIMES" NUMBER(8,0) NOT NULL ENABLE,
        "BILLTYPE" VARCHAR2(16) NOT NULL ENABLE,
        "MAILTYPE" VARCHAR2(32) NOT NULL ENABLE,
        "OPRCODE" VARCHAR2(16),
        "OPRTIME" DATE,
         SUPPLEMENTAL LOG GROUP "GGS_1936731" ("LOGID") ALWAYS,
         SUPPLEMENTAL LOG DATA (ALL) COLUMNS
   )
 PARTITION BY RANGE ("OPRTIME")
 (PARTITION "P201301"  VALUES LESS THAN (TO_DATE(' 2013-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) ,
 PARTITION "P202206"  VALUES LESS THAN (TO_DATE(' 2022-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) ,
 PARTITION "P202207"  VALUES LESS THAN (TO_DATE(' 2022-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) ,
 PARTITION "P202208"  VALUES LESS THAN (TO_DATE(' 2022-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) ,
 PARTITION "P202209"  VALUES LESS THAN (TO_DATE(' 2022-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) ,
 PARTITION "P202210"  VALUES LESS THAN (TO_DATE(' 2022-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) ,
 PARTITION "P202211"  VALUES LESS THAN (TO_DATE(' 2022-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) ,
 PARTITION "P202212"  VALUES LESS THAN (TO_DATE(' 2023-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) ,
 PARTITION "P202301"  VALUES LESS THAN (TO_DATE(' 2023-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) ,
 PARTITION "P202302"  VALUES LESS THAN (TO_DATE(' 2023-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) ,
 PARTITION "P202303"  VALUES LESS THAN (TO_DATE(' 2023-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) ,
 PARTITION "P202304"  VALUES LESS THAN (TO_DATE(' 2023-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) ,
 PARTITION "P202305"  VALUES LESS THAN (TO_DATE(' 2023-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) ,
 PARTITION "P202306"  VALUES LESS THAN (TO_DATE(' 2023-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) ,
 PARTITION "P202307"  VALUES LESS THAN (TO_DATE(' 2023-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) ,
 PARTITION "P202308"  VALUES LESS THAN (TO_DATE(' 2023-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) ,
 PARTITION "P202309"  VALUES LESS THAN (TO_DATE(' 2023-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) ,
 PARTITION "P202310"  VALUES LESS THAN (TO_DATE(' 2023-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) ,
 PARTITION "P202311"  VALUES LESS THAN (TO_DATE(' 2023-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) ,
 PARTITION "P202312"  VALUES LESS THAN (TO_DATE(' 2024-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) ,
 PARTITION "PMAX"  VALUES LESS THAN (MAXVALUE) ) ;
  CREATE UNIQUE INDEX "XXIB"."PK_IB_WL_BILLTABLOG" ON "XXIB"."IB_WL_BILLTABLOG" ("LOGID")
  ;
ALTER TABLE "XXIB"."IB_WL_BILLTABLOG" ADD CONSTRAINT "PK_IB_WL_BILLTABLOG" PRIMARY KEY ("LOGID")
  USING INDEX "XXIB"."PK_IB_WL_BILLTABLOG"  ENABLE;

```

**STR**

触发 ORA-14400 报错时，OceanBase 数据库的表结构如下，您可以看到主键为 `LOGID+OPRTIME`。

```sql
obclient [SYS]>  select dbms_metadata.get_ddl('TABLE','IB_WL_BILLTABLOG','XXIB') STR from dual\G
*************************** 1. row ***************************
STR: CREATE TABLE "IB_WL_BILLTABLOG" (
  "LOGID" NUMBER(14) CONSTRAINT "IB_WL_BILLTABLOG_OBNOTNULL_1688171714689084" NOT NULL ENABLE,
  "VALIDBILLCYC" NUMBER(8) CONSTRAINT "IB_WL_BILLTABLOG_OBNOTNULL_1688171714689114" NOT NULL ENABLE,
  "EBOXID" NUMBER(14) CONSTRAINT "IB_WL_BILLTABLOG_OBNOTNULL_1688171714689123" NOT NULL ENABLE,
  "SUBSID" NUMBER(14) CONSTRAINT "IB_WL_BILLTABLOG_OBNOTNULL_1688171714689130" NOT NULL ENABLE,
  "CUSTID" NUMBER(14) CONSTRAINT "IB_WL_BILLTABLOG_OBNOTNULL_1688171714689140" NOT NULL ENABLE,
  "PRINTTIMES" NUMBER(8) CONSTRAINT "IB_WL_BILLTABLOG_OBNOTNULL_1688171714689160" NOT NULL ENABLE,
  "BILLTYPE" VARCHAR2(16) CONSTRAINT "IB_WL_BILLTABLOG_OBNOTNULL_1688171714689168" NOT NULL ENABLE,
  "MAILTYPE" VARCHAR2(32) CONSTRAINT "IB_WL_BILLTABLOG_OBNOTNULL_1688171714689173" NOT NULL ENABLE,
  "OPRCODE" VARCHAR2(16),
  "OPRTIME" DATE,
  "OMS_OBJECT_NUMBER" NUMBER INVISIBLE,
  "OMS_RELATIVE_FNO" NUMBER INVISIBLE,
  "OMS_BLOCK_NUMBER" NUMBER INVISIBLE,
  "OMS_ROW_NUMBER" NUMBER INVISIBLE,
  CONSTRAINT "PK_IB_WL_BILLTABLOG" PRIMARY KEY ("LOGID", "OPRTIME"),
  CONSTRAINT "UK_IB_WL_BILLTABLOG_OMS_ROWID" UNIQUE ("OMS_OBJECT_NUMBER", "OMS_RELATIVE_FNO", "OMS_BLOCK_NUMBER", "OMS_ROW_NUMBER", "OPRTIME") USING INDEX LOCAL
) COMPRESS FOR ARCHIVE REPLICA_NUM = 3 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0
 partition by range("OPRTIME")
(partition P201301 values less than (TO_DATE(' 2013-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition P202206 values less than (TO_DATE(' 2022-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition P202207 values less than (TO_DATE(' 2022-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition P202208 values less than (TO_DATE(' 2022-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition P202209 values less than (TO_DATE(' 2022-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition P202210 values less than (TO_DATE(' 2022-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition P202211 values less than (TO_DATE(' 2022-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition P202212 values less than (TO_DATE(' 2023-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition P202301 values less than (TO_DATE(' 2023-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition P202302 values less than (TO_DATE(' 2023-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition P202303 values less than (TO_DATE(' 2023-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition P202304 values less than (TO_DATE(' 2023-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition P202305 values less than (TO_DATE(' 2023-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition P202306 values less than (TO_DATE(' 2023-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition P202307 values less than (TO_DATE(' 2023-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition P202308 values less than (TO_DATE(' 2023-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition P202309 values less than (TO_DATE(' 2023-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition P202310 values less than (TO_DATE(' 2023-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition P202311 values less than (TO_DATE(' 2023-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition P202312 values less than (TO_DATE(' 2024-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition PMAX values less than (MAXVALUE))
1 row in set (0.159 sec)

```

源端 Oracle 数据库验证分区键 OPERTIME 字段为 NULL 的记录，结果为 712311。

```sql
SQL> select count(*) from XXIB.IB_WL_BILLTABLOG partition(PMAX) where OPRTIME is null;

```

更新 DBCat 组件后，重现初始化表的表结构，可以看到，此时为无主键表。

```sql
obclient [SYS]> select dbms_metadata.get_ddl('TABLE','IB_WL_BILLTABLOG','XXIB') STR from dual\G
*************************** 1. row ***************************
STR: CREATE TABLE "IB_WL_BILLTABLOG" (
  "LOGID" NUMBER(14) CONSTRAINT "IB_WL_BILLTABLOG_OBNOTNULL_1688521203675300" NOT NULL ENABLE,
  "VALIDBILLCYC" NUMBER(8) CONSTRAINT "IB_WL_BILLTABLOG_OBNOTNULL_1688521203675313" NOT NULL ENABLE,
  "EBOXID" NUMBER(14) CONSTRAINT "IB_WL_BILLTABLOG_OBNOTNULL_1688521203675319" NOT NULL ENABLE,
  "SUBSID" NUMBER(14) CONSTRAINT "IB_WL_BILLTABLOG_OBNOTNULL_1688521203675325" NOT NULL ENABLE,
  "CUSTID" NUMBER(14) CONSTRAINT "IB_WL_BILLTABLOG_OBNOTNULL_1688521203675330" NOT NULL ENABLE,
  "PRINTTIMES" NUMBER(8) CONSTRAINT "IB_WL_BILLTABLOG_OBNOTNULL_1688521203675337" NOT NULL ENABLE,
  "BILLTYPE" VARCHAR2(16) CONSTRAINT "IB_WL_BILLTABLOG_OBNOTNULL_1688521203675341" NOT NULL ENABLE,
  "MAILTYPE" VARCHAR2(32) CONSTRAINT "IB_WL_BILLTABLOG_OBNOTNULL_1688521203675345" NOT NULL ENABLE,
  "OPRCODE" VARCHAR2(16),
  "OPRTIME" DATE,
  "OMS_OBJECT_NUMBER" NUMBER INVISIBLE,
  "OMS_RELATIVE_FNO" NUMBER INVISIBLE,
  "OMS_BLOCK_NUMBER" NUMBER INVISIBLE,
  "OMS_ROW_NUMBER" NUMBER INVISIBLE,
  CONSTRAINT "PK_IB_WL_BILLTABLOG" UNIQUE ("LOGID"),
  CONSTRAINT "UK_IB_WL_BILLTABLOG_OMS_ROWID" UNIQUE ("OMS_OBJECT_NUMBER", "OMS_RELATIVE_FNO", "OMS_BLOCK_NUMBER", "OMS_ROW_NUMBER", "OPRTIME") USING INDEX LOCAL
) COMPRESS FOR ARCHIVE REPLICA_NUM = 3 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0
 partition by range("OPRTIME")
(partition P201301 values less than (TO_DATE(' 2013-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition P202206 values less than (TO_DATE(' 2022-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition P202207 values less than (TO_DATE(' 2022-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition P202208 values less than (TO_DATE(' 2022-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition P202209 values less than (TO_DATE(' 2022-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition P202210 values less than (TO_DATE(' 2022-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition P202211 values less than (TO_DATE(' 2022-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition P202212 values less than (TO_DATE(' 2023-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition P202301 values less than (TO_DATE(' 2023-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition P202302 values less than (TO_DATE(' 2023-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition P202303 values less than (TO_DATE(' 2023-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition P202304 values less than (TO_DATE(' 2023-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition P202305 values less than (TO_DATE(' 2023-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition P202306 values less than (TO_DATE(' 2023-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition P202307 values less than (TO_DATE(' 2023-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition P202308 values less than (TO_DATE(' 2023-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition P202309 values less than (TO_DATE(' 2023-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition P202310 values less than (TO_DATE(' 2023-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition P202311 values less than (TO_DATE(' 2023-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition P202312 values less than (TO_DATE(' 2024-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
partition PMAX values less than (MAXVALUE))
1 row in set (0.254 sec)

```

上一篇

[OMS 迁移 INTERVAL DAY TO SECOND 字段精度失真](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000000280767)

下一篇

[Type can't convert to InternalType 异常](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000000245402) ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
