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块。“父块”类推。
...全文
171 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
数据仓库和商业决策的关系 描述当今商业领域BI和数据仓库的角色 描述为什么在线联机系统(OLTP)不能满足决策支持 决策支持系统的数据抽取流程所带来的数据仓库技术 使用数据仓库技术的原因 如何使用数据仓库来加速商业决策和提高决策的质量 中间休息十分钟 数据仓库的概念和术语 通用的,被广泛接受的数据仓库定义 独立和非独立的数据集市的不同,适用范围 数据仓库开发的一些主要方法 介绍一种常用的模型:螺旋模型方法。 设计,分析,和管理数据仓库项目 解释开发和实现数据仓库的财政目的 开发时间的控制 概述数据仓库项目的关键任务 讨论商业和用户需求的收集 如何标识用户的主要业务,并在短时间实现这一主要业务 第一天下午 数据仓库建模 讨论数据仓库环境下的数据结构 定义商业模型 定义维度模型 定义物理模型 介绍星型模型,简介雪花模型和星座模型 中间休息十分钟 构建数据仓库: 抽取数据简介 构建数据仓库的ETL (Extraction, Transformation, and Loading)概述 ETL任务, 重点和代价 解释如何去检查数据源 Oracle的ETL流程解决方案 答疑 第二天上午 元数据简介 数据仓库元数据定义、类型以及在数据仓库环境中的角色 数据仓库元数据的类型 开发元数据的策略等 中间休息十分钟 数据仓库基本概念介绍 数据仓库的基本元素 数据仓库的基本形式 数据仓库的特点 数据仓库的开发特性 数据仓库与决策支持系统 数据仓库与数据集市 定义数据仓库的商业和逻辑模型 讨论企业级的策略分析工作 定义商业模型的各个部分 讨论数据仓库中元数据所扮演的角色,及追踪元数据的方法 定义逻辑模型和实体关系模型 第二天下午 创建维模型 详细介绍星型模型 如何从商业应用中标识事实表和它们的属性(列) 如何从商业应用中标识维表和它们的属性(列) 讨论数据仓库中的层次 讨论数据仓库的分析方法 中间休息十分钟 创建物理模型 如何将维模型转换成物理模型 讨论数据仓库对体系结构的需求 介绍各种硬件体系结构的优缺点 讨论数据仓库所需的数据库服务器特性 物理模型的存储 介绍数据仓库大小的测试技术和测试样品的选取 介绍数据仓库索引的类型和策略 讨论数据仓库的表空间特性和策略 讨论数据仓库中表和索引的分区方法

2,668

社区成员

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

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