oracle存储过程 找答疑

mhx117 2014-08-19 11:35:10
换了个维护的工作突然需要使用存储过程,需要分析存储过程中的业务逻辑来定位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块。“父块”类推。
...全文
170 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
bw555 2014-08-19
  • 打赏
  • 举报
回复
引用 10 楼 mhx117 的回复:
[quote=引用 8 楼 wildwave 的回复:] 这要看接口的设置了 例如sqlplus中有个autocommit参数,当值为on时,关闭会话时若有事务未提交,会帮你commit pl/sql developer中也有这么一个配置 但不代表不commit也会自动提交,数据库本身没有这个功能
明白了,灰常感谢。 我要是结贴了 大家还可以继续回复不?[/quote] 还可以回复 好像只有很久以前的帖子不提供回复功能,具体多久不清楚
mhx117 2014-08-19
  • 打赏
  • 举报
回复
貌似仍可以回复
mhx117 2014-08-19
  • 打赏
  • 举报
回复
引用 8 楼 wildwave 的回复:
这要看接口的设置了 例如sqlplus中有个autocommit参数,当值为on时,关闭会话时若有事务未提交,会帮你commit pl/sql developer中也有这么一个配置 但不代表不commit也会自动提交,数据库本身没有这个功能
明白了,灰常感谢。 我要是结贴了 大家还可以继续回复不?
mhx117 2014-08-19
  • 打赏
  • 举报
回复
引用 7 楼 z_shousi 的回复:
[quote=引用 5 楼 mhx117 的回复:] [quote=引用 2 楼 wildwave 的回复:] 疑问① B. 如果没有rollback,并非未commit的操作生效,而是在同一个会话中可以看到未提交的数据。关闭该会话,数据将会丢失
引用 3 楼 bw555 的回复:
引用 4 楼 z_shousi 的回复:
感谢大家的帮助。理解上看我和大家都是一致的。 只是有一点: >>B. 如果没有rollback,并非未commit的操作生效,而是在同一个会话中可以看到未提交的数据。关闭该会话,数据将会丢失。 测试时,我是在C程序中 调用了别人封装的接口 来执行某存储过程。存储过程执行完后,未commit的insert操作确实生效了。 感觉结果和wildwave说的有点冲突~~ [/quote] 这种情况的话是,在没有提交的时候结束本次事务。Then这个会被提交的。[/quote] 原来还是提交了。受教了~。
小灰狼W 2014-08-19
  • 打赏
  • 举报
回复
这要看接口的设置了 例如sqlplus中有个autocommit参数,当值为on时,关闭会话时若有事务未提交,会帮你commit pl/sql developer中也有这么一个配置 但不代表不commit也会自动提交,数据库本身没有这个功能
  • 打赏
  • 举报
回复
引用 5 楼 mhx117 的回复:
[quote=引用 2 楼 wildwave 的回复:] 疑问① B. 如果没有rollback,并非未commit的操作生效,而是在同一个会话中可以看到未提交的数据。关闭该会话,数据将会丢失
引用 3 楼 bw555 的回复:
引用 4 楼 z_shousi 的回复:
感谢大家的帮助。理解上看我和大家都是一致的。 只是有一点: >>B. 如果没有rollback,并非未commit的操作生效,而是在同一个会话中可以看到未提交的数据。关闭该会话,数据将会丢失。 测试时,我是在C程序中 调用了别人封装的接口 来执行某存储过程。存储过程执行完后,未commit的insert操作确实生效了。 感觉结果和wildwave说的有点冲突~~ [/quote] 这种情况的话是,在没有提交的时候结束本次事务。Then这个会被提交的。
bw555 2014-08-19
  • 打赏
  • 举报
回复
引用 5 楼 mhx117 的回复:
[quote=引用 2 楼 wildwave 的回复:] 疑问① B. 如果没有rollback,并非未commit的操作生效,而是在同一个会话中可以看到未提交的数据。关闭该会话,数据将会丢失
引用 3 楼 bw555 的回复:
引用 4 楼 z_shousi 的回复:
感谢大家的帮助。理解上看我和大家都是一致的。 只是有一点: >>B. 如果没有rollback,并非未commit的操作生效,而是在同一个会话中可以看到未提交的数据。关闭该会话,数据将会丢失。 测试时,我是在C程序中 调用了别人封装的接口 来执行某存储过程。存储过程执行完后,未commit的insert操作确实生效了。 感觉结果和wildwave说的有点冲突~~ [/quote] wildwave说的没啥问题 你可以测试下,你插入成功未提交时,将相关程序关闭,然后重新进入,看看是否能查询到你刚刚插入的数据
mhx117 2014-08-19
  • 打赏
  • 举报
回复
引用 2 楼 wildwave 的回复:
疑问① B. 如果没有rollback,并非未commit的操作生效,而是在同一个会话中可以看到未提交的数据。关闭该会话,数据将会丢失
引用 3 楼 bw555 的回复:
引用 4 楼 z_shousi 的回复:
感谢大家的帮助。理解上看我和大家都是一致的。 只是有一点: >>B. 如果没有rollback,并非未commit的操作生效,而是在同一个会话中可以看到未提交的数据。关闭该会话,数据将会丢失。 测试时,我是在C程序中 调用了别人封装的接口 来执行某存储过程。存储过程执行完后,未commit的insert操作确实生效了。 感觉结果和wildwave说的有点冲突~~
  • 打赏
  • 举报
回复
子块和嵌套存储过程一样,假如子块或者子存储过程发生异常而未自己捕获会逐层往父块抛出。
bw555 2014-08-19
  • 打赏
  • 举报
回复
引用 1 楼 ghx287524027 的回复:
呼叫bw555
假设子块中存在异常 如果子块中不存在异常处理,则会触发本块的异常,如本块也没处理,则会触发父块的异常 如果子块中存在异常处理,但是处理的最后没有调用中断,则异常处理完成后程序从子块退出,继续执行本块后面的代码 如果子块异常处理的最后调用了中断,则程序停止运行,本块、父快后续代码也都不再执行了
小灰狼W 2014-08-19
  • 打赏
  • 举报
回复
疑问① B. 如果没有rollback,并非未commit的操作生效,而是在同一个会话中可以看到未提交的数据。关闭该会话,数据将会丢失 疑问② 3. 子块中有异常捕获处理:子块的异常处理部分若没有定义捕获到的异常,将抛回父块处理,子块停止 疑问③ 嵌套的存储过程是指在存储过程中调用别的存储过程的意思吗?这个关系和子块与父块的关系是一样的,如果出现异常,如果被调用的存储过程中有异常处理,则先在这部分异常处理中进行,否则执行外层的异常处理
ghx287524027 2014-08-19
  • 打赏
  • 举报
回复
呼叫bw555

2,668

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 认证与考试
社区管理员
  • 认证与考试社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧