今天碰到一个问题,测试童鞋希望把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;