错误的原因,一般是大量的Hard Parse 导致了shared pool中的free list中产生大量的内存小碎片,当一个需要很大内存来进行hard parse的sql语句到来时,无法从free list中找到内存,即使进行内存的释放,还是不能找到符合的内存块。从而报ORA-4031错误。

个人认用虽使用了变量绑定方法,但绑定的变量值为NULL 时,暂时为绑定的变量无效,会新增版本。
ORA-4031错误的解决方法:
1)alter system flush shared_pool;将shared pool中的所有内存清空。该方法治标不治本。
2)共享SQL语句:规范SQL语句的书写;使用绑定变量;找到没有使用绑定变量的SQL:
   如果在结果中发现一系列仅仅字面值不同的SQL,则可以修改cursor_sharing参数:
   alter system set cursor_sharing = 'force'; 来强制使用绑定变量。
3)使用shared pool中的保留区:
   select request_misses from v$shared_pool_reserved;
   如果结果大于0,则可以调大shared_pool_reserved的大小;
4)使用dbms_shared_pool.keep('对象名')将使用内存很大的对象keep在内存中
5)增加shared_pool_size的大小:



引入出处:http://www.itpub.net/thread-1894245-1-1.html