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块。“父块”类推。