oracle过程与clob一样在参数(大文本)

时间:2012-03-07 10:29:52

标签: java oracle spring stored-procedures ibatis

尝试使用过程将大型文本对象插入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:数字或值错误:字符串缓冲区太小

我试图通过互联网搜索但没有太多有用的信息。因此,任何建议或想法都将受到高度赞赏。

2 个答案:

答案 0 :(得分:1)

CLOB的限制是4 gig,所以我猜你正在处理一个在PL / SQL代码中超出的Varchar2限制。

您必须查看错误堆栈中的行号。通常Oracle会提供额外的ORA-06512错误,这些错误表明这些PL / SQL对象和错误堆栈的行号。

在您使用多字节字符的情况下,这是一个疯狂的猜测:注意您是否指定Varchar2大小(以字节为单位)(默认值)或字符。 varchar2的限制是32767字节(不是字符!)

在下面的评论后进行修改:

查看this question了解如何执行批量插入的示例

答案 1 :(得分:0)

尝试在Blob中写入字符串时出现此错误,因此我将其转换为byte []:

 byte[] bytes = content.getBytes();//conntent is a String contains more than 100 line date