当我试图使用过程将一个大型文本对象插入oracle数据库时,遇到了一个问题。
我的程序必须在oracle数据库中插入数千个项目,由于逐个插入的性能问题,我编写了一个oracle过程,并一次插入所有项目。
Ibatis:
<parameterMap id="EttAttrCall" class="java.util.Map">
<parameter property="ettAttrLst" jdbcType="CLOB" javaType="java.lang.String" mode="IN"/>
<parameter property="pjtId" jdbcType="VARCHAR2" javaType="java.lang.String" mode="IN"/>
<parameter property="createUser" jdbcType="VARCHAR2" javaType="java.lang.String" mode="IN"/>
</parameterMap>
<procedure id="insertTmpEttAttr" parameterMap="EttAttrCall">
{ call INS_TMP_ETT_ATTR(?,?,?)}
</procedure>
oracle程序:
create or replace
PROCEDURE INS_TMP_ETT_ATTR
(
ettAttrLst IN CLOB,
pjtId IN VARCHAR2,
createUser IN VARCHAR2
)
如果数据长度不超过300万个字符,一切都会正常工作,但如果超过这个数字,oracle将抛出此异常:ORA-06502:PL/SQL:数字或值错误:字符串缓冲区太小
我试着在网上搜索,但没有多少有用的信息。因此,任何建议或想法都将不胜感激。
CLOB的限制是4 gig,所以我猜您正在处理的是在PL/SQL代码中超过的Varchar2限制。
您必须查看错误堆栈中的行号。通常,Oracle提供额外的ORA-06512错误,指示这些PL/SQL对象和错误堆栈的行号。
如果您使用的是多字节字符,这只是一个猜测:请注意您是以字节(默认值)还是以字符为单位指定Varchar2大小。varchar2的限制是32767字节(不是字符!)
在下面的评论后编辑:
查看此问题以获取如何执行批量插入的示例
我在blob中写入字符串时遇到了这个错误,所以我将其转换为byte[],如下所示:
byte[] bytes = content.getBytes();//conntent is a String contains more than 100 line date