今天碰到一个问题,测试童鞋希望把tomcat的报错日志报错到数据库中,结果调用insert into的时候,报ORA-01704。

INSERT INTO SYSTEM.QYQTEST2021(ID, MLOG) VALUES(3, '好长好长的字符串..');

报错:ORA-01704:字符串文字太长

解决方案,声明一个变量v_clobsql

DECLARE v_clobsql CLOB;
BEGIN
v_clobsql := '好长的字符串';
INSERT INTO SYSTEM.QYQTEST2021(ID, MLOG) VALUES(3, v_clobsql);
COMMIT;
END;

引起原因

因为oracle在插入CLOB的数据默认会以varchar2的类型插入,所以当超过4000个字符时就会报ORA-01704的错误了(varchar2类型的字符长度是4000,注意:oracle对汉字的存储占3个字符)

测试案例:


DECLARE v_clobsql CLOB;
BEGIN
v_clobsql := '
create table system.qyqtest2021(
  id varchar2(200),
  mlog clob
);

创建JavaBean

package cn.com;

public class test{

  private String id;

  private String text;
解决方式:使用变量,通过PL/SQL将数据赋予CLOB变量,通过引用变量将数据插入

mybatis具体XML内容如下:

<insert id="insert" parameterType="cn.com.test">

  DECLARE
         V_LANG CLOB := #{text,jdbcType=CLOB};
  BEGIN

    INSERT INTO test(ID, MLOG) VALUES(#{id,jdbcType=VARCHAR}, V_LANG);

  END;
</insert>
';
INSERT INTO SYSTEM.QYQTEST2021(ID, MLOG) VALUES(3, v_clobsql);
COMMIT;
END;

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐