diff --git a/src/main/java/com/gaotao/common/utils/IfsErrorMessageUtils.java b/src/main/java/com/gaotao/common/utils/IfsErrorMessageUtils.java
index b061827..c64d13e 100644
--- a/src/main/java/com/gaotao/common/utils/IfsErrorMessageUtils.java
+++ b/src/main/java/com/gaotao/common/utils/IfsErrorMessageUtils.java
@@ -11,7 +11,15 @@ public class IfsErrorMessageUtils {
/**
* 提取Oracle错误信息中的关键内容
- * 从第一个 "ORA-20110:" 到第一个 ".\r\n" 之间的内容
+ * 支持多种Oracle错误类型:ORA-20110、ORA-06502、ORA-01403等
+ *
+ *
支持的错误类型:
+ *
+ * - ORA-20110: 应用程序自定义错误
+ * - ORA-06502: 数值或值错误
+ * - ORA-01403: 未找到数据
+ * - 其他 ORA-xxxxx 类型错误
+ *
*
* @param fullErrorMessage 完整的错误信息
* @return 提取后的关键错误信息
@@ -22,44 +30,64 @@ public class IfsErrorMessageUtils {
}
try {
- // 查找第一个 ORA-20110: 的位置
- String oraPattern = "ORA-20110:";
+ // 查找第一个 ORA- 错误的位置
+ String oraPattern = "ORA-";
int startIndex = fullErrorMessage.indexOf(oraPattern);
if (startIndex == -1) {
- // 如果没有找到 ORA-20110,尝试查找其他 ORA 错误
- oraPattern = "ORA-";
- startIndex = fullErrorMessage.indexOf(oraPattern);
- if (startIndex == -1) {
- return fullErrorMessage; // 如果没有找到任何 ORA 错误,返回原始信息
- }
+ return fullErrorMessage; // 如果没有找到任何 ORA 错误,返回原始信息
}
- // 查找第一个 .\r\n 的位置
- String endPattern = ".\\r\\n";
- int endIndex = fullErrorMessage.indexOf(endPattern, startIndex);
+ // 提取 ORA 错误码(如 ORA-20110, ORA-06502)
+ String oraErrorCode = "";
+ int colonIndex = fullErrorMessage.indexOf(":", startIndex);
+ if (colonIndex != -1) {
+ oraErrorCode = fullErrorMessage.substring(startIndex, colonIndex).trim();
+ log.debug("检测到Oracle错误类型: {}", oraErrorCode);
+ }
+
+ // 查找错误信息的结束位置
+ // 常见结束标记:.\r\n、\r\n、\n、ORA-(下一个错误)
+ String[] endPatterns = {".\\r\\n", ".\r\n", "\r\n\r\n", "\nORA-"};
+ int endIndex = -1;
+
+ for (String pattern : endPatterns) {
+ int tempEndIndex = fullErrorMessage.indexOf(pattern, startIndex);
+ if (tempEndIndex != -1) {
+ // 对于 .\r\n 和 .\n,不包含句点
+ if (pattern.startsWith(".")) {
+ endIndex = tempEndIndex;
+ } else if (pattern.equals("\nORA-")) {
+ endIndex = tempEndIndex;
+ } else {
+ endIndex = tempEndIndex;
+ }
+ break;
+ }
+ }
if (endIndex == -1) {
- // 如果没有找到 .\r\n,返回原始信息
- return fullErrorMessage;
+ // 如果没有找到结束标记,取到字符串末尾
+ endIndex = fullErrorMessage.length();
}
- // 提取错误信息:从 ORA-20110: 开始到第一个 .\r\n 之前(不包含 .\r\n)
+ // 提取错误信息:从 ORA-xxxxx: 开始到结束位置
String errorMessage = fullErrorMessage.substring(startIndex, endIndex).trim();
- // 去掉 ORA-20110: 前缀,只保留具体的错误内容
- if (errorMessage.startsWith("ORA-20110:")) {
- errorMessage = errorMessage.substring("ORA-20110:".length()).trim();
- } else if (errorMessage.startsWith("ORA-")) {
- // 处理其他ORA错误,去掉ORA-xxxxx:前缀
- int colonIndex = errorMessage.indexOf(":");
- if (colonIndex != -1) {
- errorMessage = errorMessage.substring(colonIndex + 1).trim();
+ // 去掉 ORA-xxxxx: 前缀,只保留具体的错误内容
+ if (colonIndex != -1 && colonIndex < endIndex) {
+ String messageContent = fullErrorMessage.substring(colonIndex + 1, endIndex).trim();
+
+ // 如果去掉前缀后有有效内容,则使用去掉前缀的内容
+ if (StringUtils.isNotBlank(messageContent) && messageContent.length() > 5) {
+ errorMessage = messageContent;
+ log.debug("提取到错误内容: {}", errorMessage);
}
}
// 如果提取的信息为空或太短,返回原始信息
if (StringUtils.isBlank(errorMessage) || errorMessage.length() < 5) {
+ log.warn("提取的错误信息过短,返回原始信息");
return fullErrorMessage;
}