Оракул процедура с clob как в параметре (большой текст)
Я столкнулся с проблемой при попытке вставить большой текстовый объект в базу данных 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>
процедура оракула:
create or replace
PROCEDURE INS_TMP_ETT_ATTR
(
ettAttrLst IN CLOB,
pjtId IN VARCHAR2,
createUser IN VARCHAR2
)
Все работает нормально, если длина данных не превышает 3 миллиона символов, но если больше этого числа, оракул выдаст это исключение: ORA-06502: PL/SQL: ошибка числа или значения: слишком маленький буфер строки символов
Я пытался искать через Интернет, но не очень много полезной информации. Так что любые советы или идеи будут высоко оценены.
2 ответа
Ограничение для CLOB составляет 4 гигабайта, поэтому я предполагаю, что вы имеете дело с ограничением Varchar2, которое превышено в вашем коде PL/SQL.
Вам нужно будет посмотреть на номера строк в стеке ошибок. Обычно Oracle предоставляет дополнительные ошибки ORA-06512, которые указывают эти объекты PL/SQL и номера строк стека ошибок.
Просто дикая догадка, если вы используете многобайтовые символы: позаботьтесь, указали ли вы размер Varchar2 в байтах (по умолчанию) или в символах. Ограничение для varchar2 составляет 32767 байт (не символов!)
Изменить после вашего комментария ниже:
просмотрите этот вопрос, чтобы узнать, как выполнить пакетную вставку
Я получал эту ошибку при попытке записать строку в BLOB-объект, поэтому я преобразовал ее в byte[] следующим образом:
byte[] bytes = content.getBytes();//conntent is a String contains more than 100 line date