每次存储过程修改后,jdbc的第一次调用总是报错,后来就没问题了虽然没有大碍,但很不方便理由大概能猜到一二不知道有没有解决办法?
是不是用另外一个固定的存储过程类似execute immediate这样的方法调用可以解决?

解决方案 »

  1.   

    oracle的库缓存区中保存着已经编译程序包的代码及执行树等信息.
    在库缓存区libarary cache中存储的程序包是有时间标签的.
    你每次编译完了之后, 该程序包的时间标签发生了改变, 所以libarary cache中存储的那个包就失效了.
    jdbc在编译之后的第一次调用时发现失效后会重新编译一次. 这样再次调用就ok了.
    可能的解决方法1, 就是楼主所说的在另外一个固定的存储过程中使用execute immediate调用这个包. 这样处理实际上是每次执行都重新编译, 会增加多余的分析时间花销;
    解决方式2是你在编译完过程后, 自己手工或者写代码调用一次新编译后的过程. 
      

  2.   

    谢谢1楼的建议,
    你说的“解决方式2”,是不是就是jdbc连接重启
      

  3.   


    修改后,就重新recompile一把。或者在sqlplus里调用一次。
      

  4.   

    修改后重新编译或者oracle内调用一次没用就如同1楼说的“jdbc在编译之后的第一次调用时发现失效后会重新编译一次”
    必须是jdbc调用