修复Oracle 只有在将值插入数据类型为 LONG 的列时,才可以绑定一个 LONG 值

作者:Cook 发布时间: 2025-11-07 阅读量:4 评论数:0

问题根源在于,超长的文本会被转成LONG类型。

一般有四种情况

1、真的搞错类型了

数据库类型是字符,但是java中使用了LONG类型。或者mybatis显式声明了LONG类型。

#{log.test, jdbcType=LONG}

2、数据库是VARCHAR,但是插入的文本超长。

数据库是VARCHAR,java是String,无论是否显示指定VARCHAR,都会报错。因为VARCHAR最长是4000字符。

3、数据库是CLOB或BLOB,但没有显式指定类型。

#{log.test}

直接使用参数,没有指定类型,会提示LONG的错误。因为默认是VARCHAR,超长会转成LONG。

显式指定即可。

#{log.test, jdbcType=CLOB}

4、数据库是CLOB,显示指定了类型,但使用了子查询作为参数。

#{log.test, jdbcType=CLOB}

即使显式制定了类型,且数据库也是CLOB,但是如果sql中使用了子查询作为参数,也会作为VARCHAR处理,超长会被转LONG。

比如:

MERGE INTO LOG target
        USING (SELECT #{log.id, jdbcType=VARCHAR}           AS id,
                      #{log.test, jdbcType=CLOB}        AS test
               FROM dual) src
        ON (target.id = src.id)
        WHEN MATCHED THEN
            UPDATE
            SET target.test= src.test
        WHEN NOT MATCHED THEN
            INSERT (ID,TEST)
            VALUES (#{log.id, jdbcType=VARCHAR},#{log.test, jdbcType=CLOB})

评论