最近二次开发一个项目,项目中从数据库多表中取值,通过触发器把这些值拼凑成一个varchar2类型的字符串,发现当数据量较大时字符串长度会超过4000,会报缓冲区内存不够错误。。
想过把触发器中varchar2类型改为blob或clob类型,发现还有很多以前的程序引用着这个触发器,不能改;想从源码循环拼凑数据,运行起来效率又会很慢很慢很慢。。。
怎么才能让缓冲区内存够用,求Oracle高手指点一二
------解决思路----------------------
字符串最多长度那个是 oracle自定义的,不能改, 看你描述,可以考虑创建一个中间表,将需要查询的数据插入到中间表中,后续需要时候用的时候in一下这个中间表就可以了
------解决思路----------------------
拼凑出这个字符串的用处?
要么建多个字符串,拼的时候,如果超过4000,剩余的放第2个字符串中,第2个字符串满了再放第3个字符串中……用的时候,将这几个字符串相加。
------解决思路----------------------
最好的办法,就是改成 CLOB 。
主要原因是:
你现在的长度不够用了,意味着你的业务数据是增加了(变长了),如果你要拆分成多个字段,你现原有程序,将读取不到完整的数据。
------解决思路----------------------
要看触发器中怎么用,以及该值最后插入的字段的类型
错误信息应该是CHARACTER BUFFER too SMALL,只要将变量定义中的长度加大即可,pl/sql代码中的一个varchar2类型的变量,最长可以是32767
但如果该变量最终要插入到一个类型为varchar2的字段中,那么长度最长限制为4000,只能截取到4000字节以内或用clob