Oracle PL/SQL - NO_DATA_FOUND 异常是否对存储过程性能不利?

2024-05-05

我正在编写一个需要进行大量调节的存储过程。根据 C#.NET 编码中的常识,异常会损害性能,因此我也始终避免在 PL/SQL 中使用它们。我在此存储过程中的调节主要围绕记录是否存在,我可以通过以下两种方式之一进行:

SELECT COUNT(*) INTO var WHERE condition;
IF var > 0 THEN
   SELECT NEEDED_FIELD INTO otherVar WHERE condition;
....

-or-

SELECT NEEDED_FIELD INTO var WHERE condition;
EXCEPTION
WHEN NO_DATA_FOUND
....

第二种情况对我来说似乎更优雅一些,因为这样我可以使用 NEEDED_FIELD,我必须在第一种情况的条件之后的第一个语句中选择它。更少的代码。但是,如果使用 COUNT(*) 存储过程运行得更快,那么我不介意多输入一点内容来弥补处理速度。

有什么提示吗?我是否错过了另一种可能性?

EDIT我应该提到,这一切都已经嵌套在 FOR 循环中。不确定这与使用游标是否有区别,因为我认为我无法将游标声明为 FOR 循环中的选择。


我不会使用显式游标来执行此操作。 Steve F. 不再建议人们在可以使用隐式游标时使用显式游标。

该方法与count(*)是不安全的。如果另一个会话删除了包含以下内容的行之后满足条件的行count(*),并在该行之前select ... into,代码将抛出一个无法处理的异常。

原始帖子的第二个版本没有这个问题,并且通常是首选。

也就是说,使用异常会产生较小的开销,如果您 100% 确定数据不会更改,则可以使用count(*),但我建议不要这样做。

我运行了这些基准测试甲骨文10.2.0.1 on 32位Windows。我只看经过的时间。还有其他测试工具可以提供更多详细信息(例如锁存器计数和使用的内存)。

SQL>create table t (NEEDED_FIELD number, COND number);

表已创建。

SQL>insert into t (NEEDED_FIELD, cond) values (1, 0);

已创建 1 行。

declare
  otherVar  number;
  cnt number;
begin
  for i in 1 .. 50000 loop
     select count(*) into cnt from t where cond = 1;

     if (cnt = 1) then
       select NEEDED_FIELD INTO otherVar from t where cond = 1;
     else
       otherVar := 0;
     end if;
   end loop;
end;
/

PL/SQL 过程成功完成。

过去:00:00:02.70

declare
  otherVar  number;
begin
  for i in 1 .. 50000 loop
     begin
       select NEEDED_FIELD INTO otherVar from t where cond = 1;
     exception
       when no_data_found then
         otherVar := 0;
     end;
   end loop;
end;
/

PL/SQL 过程成功完成。

过去:00:00:03.06

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Oracle PL/SQL - NO_DATA_FOUND 异常是否对存储过程性能不利? 的相关文章

  • TSQL - 生成文字浮点值

    我理解比较浮点数时遇到的许多问题 并对它们在这种情况下的使用感到遗憾 但我不是表格作者 只有一个小障碍需要克服 有人决定使用浮点数 就像您期望使用 GUID 一样 我需要检索具有特定浮点值的所有记录 sp help MyTable Colu
  • 如何使用 Hibernate (EntityManager) 或 JPA 调用 Oracle 函数或过程

    我有一个返回 sys refcursor 的 Oracle 函数 当我使用 Hibernate 调用该函数时 出现以下异常 Hibernate call my function org hibernate exception Generic
  • 捕获 foreach 条件中抛出的异常

    我有一个foreach在 foreach 本身的条件下循环期间中断的循环 有没有办法try catch抛出异常然后继续循环的项 这将运行几次 直到异常发生然后结束 try foreach b in bees exception is in
  • 为什么密码错误会导致“填充无效且无法删除”?

    我需要一些简单的字符串加密 所以我编写了以下代码 有很多 灵感 来自here http www codeproject com KB security DotNetCrypto aspx create and initialize a cr
  • 分组和切换列和行

    我不知道这是否会被正式称为枢轴 但我想要的结果是这样的 Alex Charley Liza 213 345 1 23 111 5 42 52 2 323 5 23 1 324 5 我的输入数据采用这种形式 Apt Name
  • 需要 SQL 查询澄清[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个由以下列组成的表 billid patientid doctorid fees 如何显示治疗多名患者的医生 尝试了以下代码并得到了
  • 何时在 mysql 中使用 Union [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 对于 Union 您会在什么现实情况下使用它 因为对我来说 对具有不同列用途 含义的两个表中的两个选择查询使用联合是没有意义的 例如
  • 使用联接更新表?

    我正在尝试使用表 B 中的数据更新表 A 我以为我可以做这样的事情 update A set A DISCOUNT 3 from INVOICE ITEMS A join ITEM PRICE QUNTITY B on A ITEM PRI
  • 包含列和行总计的 SQL 数据透视表

    我正在尝试将行和列总计添加到该数据透视表中 create table test4 city nvarchar 10 race nvarchar 30 sex nvarchar 10 age int insert into test4 val
  • 捕获特定的 WebException (550)

    假设我创建并执行一个System Net FtpWebRequest 我可以用catch WebException ex 捕获此请求引发的任何与 Web 相关的异常 但是 如果我有一些逻辑只想在由于以下原因引发异常时执行 550 file
  • NVARCHAR 变量在Where 子句中不起作用

    在 SQL Server 我想是 2018 我不知道如何判断 中 我的变量不起作用WHERE的条款NVARCHAR 比较应该返回值 但它什么也没返回 如果我只是手动输入声明的文本 它会突然起作用并返回值 没有任何逻辑原因应该有任何不同 类型
  • Oracle 上“描述”命令不起作用的原因是什么?

    我正在尝试在 oracle 上运行 describe table name 命令 我正在使用 dbeaver 来访问 oracle 但是 当我运行该命令时 它显示 SQLException 和错误消息 无效的 sql 语句 我该如何进行手术
  • C++ 获取 catch(...) 块中捕获的异常的描述

    我可以得到捕获的异常的描述吗 catch 堵塞 就像是 what std 异常 您可能可以使用一个技巧 catch handle exception void handle exception try throw catch const s
  • H2 SQL 日期比较

    在 H2 数据库中 如何在 TIMESTAMP 类型的列上运行查询 SELECT FROM RECORDS WHERE TRAN DATE lt 2012 07 24 Try 2012 07 24
  • 如何用约束标记一大组“传递群”?

    在 NealB解决方案之后进行编辑 与以下解决方案相比 NealB的解决方案非常非常快任何另一个 https stackoverflow com q 18033115 answers and 提出了关于 添加约束以提高性能 的新问题 Nea
  • 如何拥有引用另一个表的检查约束?

    我在 SQL Server 2008 数据库中有以下表 tblItem 其中有一个ItemID field 好项目 它还有一个 ItemID 字段 并且有一个指向 tblItem 的外键 tblBadItem 它也有一个 ItemID 字段
  • PLSql 返回值

    我再次使用一些 PLSql 我想知道 是否有任何方法可以像选择一样使用以下函数 而不必将其转换为函数或过程 这样我就可以从包含它的脚本中看到代码 代码如下 DECLARE outpt VARCHAR2 1000 flow rI VARCHA
  • Oracle Text:如何清理用户输入

    如果有人有使用 Oracle 文本的经验 CTXSYS CONTEXT 我想知道当用户想要搜索可能包含撇号的名称时如何处理用户输入 在某些情况下 转义 似乎有效 但对于单词末尾的 s 则不起作用 s 在停用词列表中 因此似乎已被删除 目前
  • 如何在PL/SQL中模拟32位有符号整数溢出?

    您知道如何在 Oracle PL SQL 中模拟 32 位整数溢出吗 例如 2147483647 1 2147483648 or 2147483648 1 212147483647 我尝试了 PLS INTEGER 但它引发了溢出异常 我终
  • MongoDB:javascript执行失败:无法在 src/mongo/shell/collection.js 保存 DBQuery 对象

    在 MongoDb 中 当我尝试修改集合中的现有文档时 它会生成以下异常 javascript execution failed can t save a DBQuery object at src mongo shell collecti

随机推荐

  • 如何检查 firebase 中是否存在孩子? [复制]

    这个问题在这里已经有答案了 我有一个 firebase 它有一个名为 users 的节点 用户给出一个用户名 我想检查该用户名是否已作为用户节点的子节点存在 这是我目前正在尝试的代码 平台是安卓 String myUsername user
  • 如何更改 Kotlin 上生成的 TODO() 函数体?

    我需要在我的代码上留下一些稍后要做的事情TODO 自动生成的会产生一个很长的评论 如下所示 TODO not implemented To change body of created functions use File Settings
  • Requests-html 导致 OSError: [Errno 8] 调用 html.render() 时执行格式错误

    我正在使用 requests html 并尝试渲染功能 但收效甚微 当我使用 python3 8 运行这个脚本时 usr bin python3 from requests html import HTML file scrape temp
  • 您忽略了哪些 PEP 8 准则,哪些是您坚持的? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 多年来 我编写的 Python 越多 我就越发现自己同意大多数准则 尽管我出于自己的原因始终有意地违反了一些准则 我很想知道 PEP 8 也可能
  • 在 Android 中的计时器内运行异步任务

    我正在开发一个基本的聊天类型应用程序 目前我正在运行代码 如下所示 class GetMsgs extends AsyncTask
  • 长按 UIButton

    我想知道如果有人按住 UIButton 按键的时间过长 我是否可以捕获 UIButton 的事件 通过通知或其他机制 比按一次按钮的时间更长 假设有人按住按钮几秒钟 谢谢 你可以加UILongPressGestureRecognizer h
  • Android 是否可以同时使用前后摄像头[重复]

    这个问题在这里已经有答案了 我想同时使用设备的前置和后置摄像头 在我的应用程序中 屏幕的前半部分将显示后置摄像头的预览 屏幕的下半部分将显示前置摄像头的预览 我尝试过设置两个不同的相机预览 但是当我打开应用程序时 屏幕的前半部分 显示后置相
  • 将文件附加到 WCF REST 服务响应

    我有一个看起来像这样的资源 users id summary format format When format是 xml 或 json 我用一个由 WCF 自动编码的用户摘要对象进行响应 到目前为止还不错 但当format等于 pdf 我
  • 什么是样板代码、热点代码和热点?

    我知道这些术语是在性能实现 优化的背景下使用的 最近一直在研究这个问题 并尝试过搜索 但没有得到任何例子 清楚地阐述 描述这些概念以及在现实世界开发场景中实现这些问题 概念 有人可以彻底解释这些术语 示例场景以及可能使用这些概念和术语的地方
  • 如何在 jQuery 中检查 null 对象

    我正在使用 jQuery 我想检查页面中是否存在某个元素 我写了以下代码 但它不起作用 if btext i null alert btext i text btext i text Branch i 如何检查元素是否存在 检查jQuery
  • Python多线程模型

    我已经研究 python 中的多线程有一段时间了 但是我对一些问题感到困惑 首先 python线程库创建的线程是用户级线程还是内核级线程 书上说用户级线程必须映射到内核线程并且 操作系统仅创建和维护内核级线程 python中将使用哪种线程模
  • 如何重命名 Rails 4 应用程序?

    rails plugin install git github com get Rename git将允许我们仅重命名 Rails 3 应用程序 是否有任何 gem 可用于重命名 Rails 4 应用程序 如果没有 请建议我更好的重命名方法
  • ASP .Net 报表查看器控件中的本地报表与服务器报表

    在我们当前工作的 ASP Net 站点之一中 我们有大量 SSRS 报告 我们对该站点进行了表单身份验证 并且已在报表服务器中创建并部署了报表 当我们设置报表查看器控件来访问服务器报表时 我们遇到了很多身份验证问题 我只是想知道使用本地报告
  • .NET WPF 窗口淡入和淡出动画

    下面是窗口淡入和淡出动画的代码片段 Create the fade in storyboard fadeInStoryboard new Storyboard fadeInStoryboard Completed new EventHand
  • 我应该在哪里划清词法分析器和解析器之间的界限?

    我正在为 IMAP 协议编写一个词法分析器 用于教育目的 但我很困惑应该在词法分析器和解析器之间划清界限 以 IMAP 服务器响应为例 FLAGS Answered Deleted 该响应的正式语法定义如下 mailbox data FLA
  • 是否可以将 pyobjc 与特权 XPC 帮助工具和 XPCInterface API 一起使用?

    我相信这个问题的答案是 否 但我将其发布给社区 以防有人比我更成功 我有一个特权帮助程序工具 客户端 Cocoa 应用程序将其与 NSXPCConnection 和 NSXPCInterface 一起使用 该接口本身包括一个通过完成处理程序
  • d3 地理投影从正交到 X 的过渡

    我正在开发一个教育地图项目 其中显示不同的地图投影 我想在选择不同投影之间实现变形过渡 我找到了一个很好的例子来实现它 并且我没有遇到太多的麻烦来重新创建它 不幸的是 我还需要裁剪投影的功能 这与目标状态完美配合 但在改变投影时则不然 当选
  • 如何为用户提供给定 boost::spirit 语法的自动完成建议?

    我正在使用 Boost Spirit 在我的 C GUI 应用程序中为非技术用户构建简单的 数据过滤器 语言 语言与纯英语非常相似 并且可以解析为 AST 我被要求使该过程尽可能对用户友好 因此我希望提供类似 CLang 的错误消息 无法识
  • 自定义文件属性

    我需要遵循 在我的申请中 我有文件 需要随时签入和签出的文件 当我从应用程序中签出文档时 我需要将自定义属性添加到文件中 以便稍后在签入文档时可以识别它 我尝试使用以下代码使用 DSOFile 中的 OleDocumentPropertie
  • Oracle PL/SQL - NO_DATA_FOUND 异常是否对存储过程性能不利?

    我正在编写一个需要进行大量调节的存储过程 根据 C NET 编码中的常识 异常会损害性能 因此我也始终避免在 PL SQL 中使用它们 我在此存储过程中的调节主要围绕记录是否存在 我可以通过以下两种方式之一进行 SELECT COUNT I