产生这种现象的原因:
在Oracle中,表的某字段为Clob类型,我们知道,此种类型不是能存4G的数据么,为什么我插入多于4000个字符就会报错呢?原因是这样的,Oracle中,使用inset或者update更新数据库表时,默认把字符串转化成VARCHAR2类型,而VARCHAR2类型最大长度为4000,所以当插入数据大于4000时,就会报ORA-01704。
解决方法:
既然我们选择了CLOB类型,就是希望存储大数据的,显示,在插入或更新数据库之前,我们应该把字符串转化成clob类型的。具体做法如下:
declare v_clob clob := '大数据';begin insert into test(ID,Content) values (1, v_clob);end;
例子:
declare
v_clob clob :='<!#code~<#>!123456@~><!#pageCount~<#>!1@~>
<!#activDefId~<#>!123456@~><!#isCommit~<#>!0@~>
<!#mbHeader~<#>!xxxxx@~><!#mbTitle~<#>!xxxxx@~>
<!#tmrecInfoList~<#>![com.xx.xxxx.common.bean.xxx@xxxx]@~>
<!#isShowChapter~<#>!true@~><!#mbZip~<#>!邮政编码:100000@~>
<!#intlCls~<#>!7@~><!#flowUnitId~<#>!aaaaaaaaaaaaaaaaaaaaaaa@~>
<!#flowInstId~<#>!e48b88e24fb6e5b3014fb72beb201f38@~>
<!#activeFlag~<#>!0@~><!#regNum~<#>!00000000@~>
<!#fileType~<#>!xx@~><!#appCnName~<#>!xxxx@~>
<!#ysList~<#>![]@~><!#regionalId~<#>!000000@~>
<!#tmyyCoOwnerInfo~<#>![]@~>
<!#fileContent~<#>!xxxxxx:
xxxxxxxxxxxxxxxxxxxxxxxxxxxx。
xxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxx:
xxxxxxxxxxxxxxxx'||chr(38)||'xxxxxxxxxxxxxxxxxxx'||chr(38)||'xxxxxxxxx'||chr(38)||
'xxxxxx'||chr(38)||'xxxx'||chr(38)||'#000000@~>
<!#flowUnitCode~<#>!zzzzzzz@~><!#recAddr~<#>!xxxx@~><!#printCount~<#>!1@~><!#appNum~<#>!xxxx@~>
<!#mbAddr~<#>!地址:xxxxx@~><!#issueDate~<#>!Wed Dec 02 xx:xx:xx GMT+08:00 2015@~><!#seqNum~<#>!xxxxx@~>
<!#isShowOprMode~<#>!true@~><!#lang~<#>!0@~><!#zczList~<#>![]@~><!#appDate~<#>!xxxx@~>
<!#agentName~<#>!xxxxx@~><!#isValid~<#>!1@~><!#oprMode~<#>!1@~><!#fwNum~<#>!xxxxxx@~>
<!#showOprMode~<#>!xxxx@~><!#licenseeCnName~<#>!xxxxx@~><!#recName~<#>!xxxx@~><!#flowCode~<#>!SYXK@~>
<!#lawDicVerNum~<#>!1.0@~><!#barcode~<#>!xxxxxxx@~>
<!#recName~<#>!xxxxxxxxxxxxx@~><!#recAddr~<#>!xxxxxxxxxxxx@~><!#recZip~<#>!@~>
<!#performType~<#>!1@~><!#agentId~<#>!000000@~><!#regionalismId~<#>!00000@~><!#existsSd~<#>!false@~>';
begin
update test t set t.content = v_clob where t.id = '123456';
end;
/
变更的字符串中出现了Oracle的关键字&符号,在这里采用chr(38)来进行替代。
如果是修改clob字段里面较少的部分,可以根据实际情况使用replace函数替换即可
例如:
update test a
set a.content =(select replace(t.content,'<!#fwNum~<#>!aaaaa@~>','<!#fwNum~<#>!bbbbbbb@~>') from test t where t.id = '123456')
where a.id = '123456';