oracle存储过程 觅答疑
换了个维护的工作突然需要使用存储过程,需要分析存储过程中的业务逻辑来定位bug。
对于我这之前一直从事C开发,数据库只用过select * from tableA,存储过程是什么都已经没有印象的人来说,顿感觉亚历山大...
盯着上百上表和七八百个存储过程看了些天,终于有了眉目。在此提出一点疑问和一点见解希望老师指点。
疑问①:储存过程执行的操作没有commit会怎样?
实验结果:
A:存储过程执行完前,如果有rollback操作,commit的操作生效,未commit的操作被回滚了(即commit操作之前操作生效,commit操作之后的操作无效)。
B:存储过程执行完前,如没有rollback操作,commit的操作生效, 未commit的操作也生效。
疑问②:存储过程的begin-end块中select * into * from * where * 找不到数据时会怎样?
实验结果:找不到数据时,会报no_data_found的异常。
1.本块中有异常处理:跳转到异常处理执行直到存储过程执行完,异常前后的操作参考规则AB。
2.本块中没有异常处理,子块和父块中也没有异常捕获处理:存储过程执行中止,异常之前的操作参考AB。异常之后的操作不会执行(中止了嘛)。
3.子块中有异常捕获处理:捕获不到异常,存储过程执行中止,异常之前的操作参考AB。异常之后的操作不会执行。
4.父块中有异常捕获处理:跳转到异常处理执行直到存储过程执行,异常前后的操作参考规则AB。
疑问③:嵌套的存储过程调用的场合,异常会怎么处理?
尚未实验,不自有人指点否...
注:“本块”指发生异常的begin-end块。“子块”指发生异常的begin-end块中包含的begin-end块。“父块”类推。
------解决方案--------------------
呼叫bw555
------解决方案--------------------
假设子块中存在异常
如果子块中不存在异常处理,则会触发本块的异常,如本块也没处理,则会触发父块的异常
如果子块中存在异常处理,但是处理的最后没有调用中断,则异常处理完成后程序从子块退出,继续执行本块后面的代码
如果子块异常处理的最后调用了中断,则程序停止运行,本块、父快后续代码也都不再执行了
------解决方案--------------------
这种情况的话是,在没有提交的时候结束本次事务。Then这个会被提交的。
------解决方案--------------------
这要看接口的设置了
例如sqlplus中有个autocommit参数,当值为on时,关闭会话时若有事务未提交,会帮你commit
pl/sql developer中也有这么一个配置
但不代表不commit也会自动提交,数据库本身没有这个功能