---
title: "Oracle 兼容应用错误处理规范 - OceanBase 数据库 V4.2.5 | OceanBase 文档中心"
description: Oracle 兼容应用错误处理规范 本节主要介绍 Oracle 兼容应用的错误处理规范。 OceanBase 数据库从 V2.0 版本开始全面兼容 Oracle 数据库，提供 Oracle 兼容租户模式。在错误码方面，尽量保证错误码、SQLSTATE、错误消息三个信息均与 Oracle 数据库保持一致。因此，作为我们…
image: https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*OSPzQ6GUQF4AAAAAQHAAAAgAeiGDAQ/original
---
切换语言

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

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 4.2.5 LTS

# Oracle 兼容应用错误处理规范

更新时间：2026-04-15 17:16:58

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.2.5/zh-CN/300.develop/200.application-development-of-oracle-mode/700.application-error-handling-specification-and-common-error-solutions-of-oracle-mode/100.application-error-handling-specification-of-oracle-mode/200.application-error-handling-specification-of-oracle-mode.md)  

本节主要介绍 Oracle 兼容应用的错误处理规范。

OceanBase 数据库从 V2.0 版本开始全面兼容 Oracle 数据库，提供 Oracle 兼容租户模式。在错误码方面，尽量保证错误码、SQLSTATE、错误消息三个信息均与 Oracle 数据库保持一致。因此，作为我们的产品设计原则，应用错误处理规范可参考 Oracle 数据库的处理规范。但是，作为一个分布式数据库，OceanBase 数据库与集中式 Oracle 数据库有着本质的不同，一些分布式环境下特有的错误无法用 Oracle 数据库的错误码来表达，故将这类内部错误码映射为错误码 `ORA-00600`，表明它是 OceanBase 数据库特有的错误码。

在 OceanBase 数据库的 Oracle 租户模式中，错误消息格式与 Oracle 数据库兼容，会以 "前缀 + 数字编码" 的形式返回。如果错误源于 SQL，则会返回以 `ORA` 开头的错误消息；如果错误源于存储过程，则会返回以 `PLS` 开头的错误消息。OceanBase 数据库服务器端在 Oracle 租户模式下完整的错误码清单，请参见 [错误信息概述](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001500122)。

对于 `ORA-00600` 错误码，应用程序需要从错误消息中提取具体的内部错误码。例如，在下面这个错误消息中，内部错误码为 `6210`。

```shell
ORA-00600: internal error code, arguments: -6210, Transaction timeout occurred, please rollback the transaction, set the variable ob_trx_timeout to a larger value and then restart the transaction

```

## 获取错误码信息

不同语言的驱动程序提供了不同的 API 以获取错误信息，关于各驱动的详细介绍请参见 [连接方式概述](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001499915) 中的 **驱动** 章节。

### Java 驱动库

使用 JDBC 的 Java 应用程序执行 SQL 语句失败时，可以捕获 SQLException 异常，且该异常包含了错误码、SQLSTATE、错误信息三种信息，关于 SQLException 异常的详细信息请参见 [JDBC API 文档](https://docs.oracle.com/javase/1.5.0/docs/api/java/sql/SQLException.html)。

捕获 SQLException 异常的方法如下：

- 调用 getErrorCode() 获取错误码
 - 调用 getSQLState() 获取 SQLSTATE
 - 调用 getMessage() 获取错误消息

### OBCI 驱动库

OBCI 提供了与 Oracle OCI 兼容的 C 语言驱动库。当函数调用返回 `OCI_ERROR` 时，应用程序通过函数 [OCIErrorGet()](https://docs.oracle.com/cd/B12037_01/appdev.101/b10779/oci16ms9.htm) 的输出参数获取错误信息：

- 通过输出参数 errcodep 获取错误码
 - 通过输出参数 sqlstate 获取 SQLSTATE
 - 通过输出参数 bufp 获取错误消息

## 错误处理规范

对于 OceanBase 数据库 Oracle 租户模式下的大多数错误码，应用程序不需要做专门处理，可以直接对外报错。 为了容错和增强应用程序的健壮性，对于某些错误码，根据不同的场景和错误性质，可以采用如下四种不同的策略：

1. 策略一：根据语句类型处理。

      - 如果是执行 `SELECT` 语句时报超时错误，因为没有副作用，可以重试。
      - 如果是远程或分布式执行 `UPDATE` 等修改语句时报超时错误，则语句究竟是否执行成功是不确定的，需要回滚事务（如果修改语句的语义是幂等的，可以尝试重试该语句）。
      - 如果是执行 `COMMIT` 或 `ROLLBACK` 语句时报超时错误，由于事务状态是未知的，需要直接对外报错。
 2. 策略二：任何语句执行报错，回滚当前事务，然后重试事务。
 3. 策略三：任何语句执行报错，重试当前语句。
 4. 策略四：任何语句执行报错，关闭当前连接，然后重建连接。

特别地，由于开发习惯，很多使用 OCI 接口开发的服务类应用会使用长连接，若数据库服务端发生了运行时异常而不做处理，可能会造成服务无法自动恢复。对于这类应用，需要按照下面 **OceanBase 数据库特有的错误码** 和 **Oracle 兼容错误码** 中的建议进行错误处理。

### OceanBase 数据库特有的错误码

以下错误码是常见的 OceanBase 数据库服务端特有的运行时异常的错误码，根据下表中不同的“内部错误码”，应用程序可以按照“处理策略”的建议进行处理。

| 错误码 | 内部错误码 | 含义 | 语句执行结果 | 事务状态 | 处理策略 |
| --- | --- | --- | --- | --- | --- |
| ORA-00600 | 4012 | 执行超时 | 未知 | 未知 | 策略一 |
| ORA-00600 | 4038 | 当前副本非主副本，不能提供服务。一般在副本发生切主时可能出现。 | 失败 | 不变 | 策略三 |
| ORA-00600 | 4225 | 分区不存在。一般在副本发生迁移时可能出现。 | 失败 | 不变 | 策略三 |
| ORA-00600 | 6210 | 事务执行超过限制时长 | 失败 | 不变 | 策略二 |
| ORA-00600 | 6231 | 副本数据不可读。一般在副本发生迁移时可能出现。 | 失败 | 不变 | 策略三 |
| ORA-00600 | 8001~8004 | 连接不可恢复 | 失败 | 未知 | 策略四 |

#### 注意

对于这些 `ORA-00600` 错误码，应用程序需要从错误消息中提取具体的内部错误码。通过下面的格式化字符串，提取占位符 `%d` 位置的整数，即为内部错误码。

```shell
ORA-00600: internal error code, arguments: %d

```

### Oracle 兼容错误码

对于一般 Oracle 数据库兼容的错误码，请遵循与 Oracle 数据库相同的处理方式。特别的，以下一些错误码是 OceanBase 数据库 Oracle 租户模式下常见的异常，应用程序可以按照下表中“处理策略”的建议进行处理。

| 错误码 | 含义 | 语句执行结果 | 事务状态 | 处理策略 |
| --- | --- | --- | --- | --- |
| ORA-01555 | 读取到的快照版本太旧 | 失败 | 不变 | 策略三 |
| ORA-24761 | 事务被系统内部回滚 | 失败 | 被回滚 | 策略二 |
| ORA-08177 | 当前事务无法串行化。一般在 RR（Repeatable Read） 和 Serializable 隔离级别有事务并发冲突时可能出现。     关于事务隔离级别的详细介绍，请参见 [事务隔离级别概述](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001502863)。 | 失败 | 不变 | 策略二 |

对于使用了 OBCI 的应用程序，驱动端内会返回一些 Oracle 数据库兼容的错误码，也遵循 Oracle 数据库相同的处理方式。特别的，应用程序需要关注以下错误码。

| 错误码 | 含义 | 处理策略 |
| --- | --- | --- |
| ORA-03113 | 与服务端连接断开 | 重建连接 |
| ORA-01403 | 期望的行数大于返回结果的行数 | 报错或检查应用程序逻辑是否正确 |
| ORA-01405 | 列值为空 | 处理 NULL 值问题 |
| ORA-01406 | 返回的结果超过缓冲区长度 | 加大接收数据的缓冲区长度 |

 上一篇 下一篇 ![有帮助](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) 咨询热线
