java往oracle存clob类型的值时,字符长度过长怎么办?

简介: java往oracle存clob类型的值时,字符长度过长怎么办?

业务场景

将照片转为数字长串后,由于字符过长,java往数据库中直接存为clob字段时,oracle会报ORA-01704问题:字符串文字过长。

这是因为一般对含有CLOB字段的数据操作。

如果CLOB字段的内容非常大的时候,会导致SQL语句过长。

隐式转换:oracle默认把字符串转换成varchar2类型,varchar2类型最大字符串的长度为4000,当字段长度比4000大时,所以会报ora-01704错误。

简言之,就是两个单引号之间的字符长度不能超过4000。

解决办法总结

试过几种办法,发现只有最后一种是有效的,现将错误与正确的方法都进行了总结,错误的进行避免,正确的可以借鉴。

1.将字符串按照固定长度截取,insert语句:to_clob('字符1' || '字符2' || '字符3' || '字符4' .......),此方法无效,隐式转换成了varchar2,字符长度超过4000;

2.将超长字段按照一定的长度进行截取,用to_clob()函数拼接insert语句,将截取的字符用连接符 ‘||’ 连接起来存入clob字段中,insert语句:to_clob('字符1') || to_clob('字符2') || to_clob('字符3') || to_clob('字符4') ....... 此方法有效。

/**
 * 将超长的内容转为clob可以保存的句式
 * 字符串每隔2000长度插入指定字符串 ' ) || TO_CLOB( '
 * @param original         处理超长字符串
 * @param insertString     插入字符串 ') || TO_CLOB('
 * @param interval         间隔的字符长度 2000
 * @return
 */
public static String stringInsertByInterval(String original, String insertString, int interval) {
   if (original == null) return "";
   Integer len = original.length();
   if (interval >= len) return original;
   String rtnString = original;
   if (original.length() > interval) {
      List<String> strList = new ArrayList<String>();
      Pattern p = Pattern.compile("(.{" + interval + "}|.*)");
      Matcher m = p.matcher(original);
      while (m.find()) {
         strList.add(m.group());
      }
      strList = strList.subList(0, strList.size() - 1);
      rtnString = StringUtils.join(strList, insertString);
   }
   rtnString = “'TO_CLOB('” + rtnString + "')";
   return rtnString;
}
目录
相关文章
|
17天前
|
监控 Java 调度
Java面试题:描述Java线程池的概念、用途及常见的线程池类型。介绍一下Java中的线程池有哪些优缺点
Java面试题:描述Java线程池的概念、用途及常见的线程池类型。介绍一下Java中的线程池有哪些优缺点
31 1
|
1月前
|
Java
JAVA工具类匹配重复或者连续的字符和符号
JAVA工具类匹配重复或者连续的字符和符号
20 2
|
1月前
|
Java Serverless
Java字符个数统计代码
Java字符个数统计代码
31 6
|
1月前
|
Java 数据处理 Apache
探讨Java中判断String类型为空和null的方法
探讨Java中判断String类型为空和null的方法
22 1
|
22天前
|
Java API 索引
Java中的字符串与字符操作详解
Java中的字符串与字符操作详解
|
22天前
|
存储 Java
Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
|
26天前
|
Java 程序员 API
Java异常类型及异常处理方式
Java异常类型及异常处理方式
|
29天前
|
存储 安全 Java
JAVA泛型:类型安全,从编译时开始!
【6月更文挑战第28天】Java泛型是JDK 5引入的特性,用于在编译时实现类型安全的集合。它通过类型参数增强代码灵活性和重用性,减少错误。示例展示了泛型列表`List&lt;Integer&gt;`和`List&lt;String&gt;`如何确保元素类型正确,防止编译时类型不符。泛型提升了代码的类型安全、可读性和维护性。
|
29天前
|
安全 Java 编译器
JAVA泛型,编译时类型安全的“秘密武器”
【6月更文挑战第28天】Java泛型是JDK 5引入的特性,用于在编译时增强类型安全和代码复用。它允许类、接口和方法使用类型参数,确保运行时类型匹配,减少了类型转换错误。例如,泛型方法`&lt;T&gt; void printArray(T[] array)`能接受任何类型数组,编译器会检查类型一致性。此外,泛型提升了代码的可读性、可维护性和与容器类的配合效率,优化整体软件质量。
|
29天前
|
安全 Java 开发者
谁说 JAVA 不懂爱?泛型来给你满满的类型安全感!
【6月更文挑战第28天】Java泛型,编程中的类型守护者,提供编译期类型检查,增强代码安全与可读。如`GenericBox<T>`示例,实现类型参数化,避免转换错误。泛型方法如`printArray<T>`,灵活处理不同数据。它简化代码,消除潜在错误,赋予开发者类型保障的爱,让编程之旅更安心。Java的泛型,是对其语言之爱的深刻表达。

推荐镜像

更多