热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

哪个命令引发了异常?

如何解决《哪个命令引发了异常?》经验,为你挑选了1个好方法。

是否有一个类似SQLERRMSQLCODE包含引发错误的语句的变量?

例:

/* 
if some error raised from this code 
and I want to know which statement cause the failure..
I wish to use some oracle varaible to know it
*/
begin

select * from t1;
select * from t2;

exception when others
 dbms_output.put_line(sqlerrm || ' raised from this statement:' || ;
end;

-- excepted result: no data found raised from this statement: select * from t2

APC.. 5

简单的答案,不。通过定义异常处理程序,您将丢失一些信息。对于未处理的异常,您会收到一条包含行号的错误消息。但是显然我们需要处理错误,记录错误等。因此,没有行号是很垃圾的。

幸运的是,有两种选择。在旧版本的Oracle中,我们可以使用dbms_utility.format_error_backtrace()dbms_utility.format_error_stack()获取一些有用的信息,包括行号。它非常笨拙,并且(特别是用于回溯)非常冗长。

在Oracle 12c中,我们得到了一个专门用于PL / SQL调用堆栈的完整软件包:UTL_CALL_STACK。它是一个位盒,需要多个调用才能得到,但是我们可以使用来检索特定的行号unit_line()。蒂姆·霍尔(Tim Hall)对新功能进行了典型的精美介绍。了解更多。


要考虑的另一件事是良好的程序设计如何解决此问题。特别是单一责任原则。这是程序设计的基本准则:程序单元应该做一件事。如果我们问“通过此错误执行哪个命令”的问题,则可能表明我们违反了SRP。

让我们辞职代码,使其遵循以下设计原则:

declare
    type nt1 is table of t1%rowtype;
    type nt2 is table of t2%rowtype;
    l_t1 nt1;
    l_t2 nt2;
    x_t1_ndf exception;
    x_t2_ndf exception;

    function get_t1 return nt1 is
      return_value nt1;
    begin
      select * 
      bulk collect into return_value
      from t1;
      if  return_value.count() = 0 then 
        raise x_t1_ndf;
      end if; 
      return return_value;
  end get_t1;

  function get_t2 return nt2 is
    return_value nt2;
  begin
    select * 
    bulk collect into return_value
    from t2;
    if  return_value.count() = 0 then 
      raise x_t2_ndf;
    end if; 
    return return_value;
  end get_t2;
begin
  l_t1 := get_t1;
  l_t2 := get_t2;
exception 
  when x_t1_ndf then
      dbms_output.put_line('T1 has no data');
  when x_t2_ndf then
      dbms_output.put_line('T2 has no data');
end;

显然,键入的内容比原始代码多,但是部分原因是,此玩具是完整的工作代码,与您发布的代码不同。同样在现实生活中,这些模块将是离散的单元,而不是匿名块中的私有功能,因此我们可以在其他多个程序中重复使用它们。

dbms_output.put_line()也不是处理异常的正确方法,但是我已经离开了,因为这就是您的代码所做的。



1> APC..:

简单的答案,不。通过定义异常处理程序,您将丢失一些信息。对于未处理的异常,您会收到一条包含行号的错误消息。但是显然我们需要处理错误,记录错误等。因此,没有行号是很垃圾的。

幸运的是,有两种选择。在旧版本的Oracle中,我们可以使用dbms_utility.format_error_backtrace()dbms_utility.format_error_stack()获取一些有用的信息,包括行号。它非常笨拙,并且(特别是用于回溯)非常冗长。

在Oracle 12c中,我们得到了一个专门用于PL / SQL调用堆栈的完整软件包:UTL_CALL_STACK。它是一个位盒,需要多个调用才能得到,但是我们可以使用来检索特定的行号unit_line()。蒂姆·霍尔(Tim Hall)对新功能进行了典型的精美介绍。了解更多。


要考虑的另一件事是良好的程序设计如何解决此问题。特别是单一责任原则。这是程序设计的基本准则:程序单元应该做一件事。如果我们问“通过此错误执行哪个命令”的问题,则可能表明我们违反了SRP。

让我们辞职代码,使其遵循以下设计原则:

declare
    type nt1 is table of t1%rowtype;
    type nt2 is table of t2%rowtype;
    l_t1 nt1;
    l_t2 nt2;
    x_t1_ndf exception;
    x_t2_ndf exception;

    function get_t1 return nt1 is
      return_value nt1;
    begin
      select * 
      bulk collect into return_value
      from t1;
      if  return_value.count() = 0 then 
        raise x_t1_ndf;
      end if; 
      return return_value;
  end get_t1;

  function get_t2 return nt2 is
    return_value nt2;
  begin
    select * 
    bulk collect into return_value
    from t2;
    if  return_value.count() = 0 then 
      raise x_t2_ndf;
    end if; 
    return return_value;
  end get_t2;
begin
  l_t1 := get_t1;
  l_t2 := get_t2;
exception 
  when x_t1_ndf then
      dbms_output.put_line('T1 has no data');
  when x_t2_ndf then
      dbms_output.put_line('T2 has no data');
end;

显然,键入的内容比原始代码多,但是部分原因是,此玩具是完整的工作代码,与您发布的代码不同。同样在现实生活中,这些模块将是离散的单元,而不是匿名块中的私有功能,因此我们可以在其他多个程序中重复使用它们。

dbms_output.put_line()也不是处理异常的正确方法,但是我已经离开了,因为这就是您的代码所做的。


推荐阅读
  • ThinkPHP 文件缓存组件详解与应用
    本文深入探讨了ThinkPHP框架中的文件缓存类实现,提供了详细的代码示例和使用说明,旨在帮助开发者更好地理解和利用这一功能来优化应用程序性能。 ... [详细]
  • 本文档详细介绍了服务器与应用系统迁移的策略与实施步骤。迁移不仅涉及数据的转移,还包括环境配置、应用兼容性测试等多个方面,旨在确保迁移过程的顺利进行及迁移后的系统稳定运行。 ... [详细]
  • 睿智汇海教育致力于培养杰出的IT专业人才,确保学员在就业市场上具备竞争力,助其实现职业成功。我们提供的C#/.Net/Asp.Net培训课程,旨在通过系统的教学和丰富的实践机会,帮助学员掌握最新的技术知识。 ... [详细]
  • 统一幻灯片标题:使用母版功能的技巧
    本文详细介绍了如何通过PowerPoint中的幻灯片母版功能,实现所有幻灯片标题的一致性设置。同时,提供了其他办公软件和编程相关的实用技巧。 ... [详细]
  • MySQL 5.7 绿色版安装及 my.ini 配置详解
    本文主要针对最近因系统重装导致的MySQL配置问题,详细介绍了MySQL 5.7.24绿色解压版的安装步骤及my.ini配置文件的关键设置,帮助用户顺利完成数据库的安装与配置。 ... [详细]
  • 本文介绍如何利用JavaScript在页面加载时为ASP.NET的DropDownList控件设置特定的选项值。 ... [详细]
  • MyBatis入门指南
    本文详细介绍了MyBatis的基础知识,包括如何整合日志框架(如log4j和logback),使用外部JDBC文件,getMapper()方法的应用,以及别名设置等技巧。 ... [详细]
  • 在使用 SQL 语句从数据库中提取数据并尝试将其转换为其他数据类型时,可能会遇到 'java.math.BigDecimal cannot be cast to java.lang.Integer' 错误。本文将详细解释这一错误的原因,并提供有效的解决方案。 ... [详细]
  • 本文探讨了如何利用脚本文件高效管理Oracle数据库,包括脚本文件的创建、编辑及运行方法,旨在为数据库管理人员提供实用指导。 ... [详细]
  • 使用H5在前端生成Excel文件的方法
    本文介绍了一种利用HTML5和JavaScript库在浏览器端直接生成并下载Excel文件的技术方案。通过引入alasql.js和xlsx.core.min.js两个库,可以轻松实现数据导出功能。 ... [详细]
  • 本文介绍了一种方法,用于创建一个包含中文数据的 Employees 表,并确保在 SQL Server 中能够正确显示和处理中文字符。 ... [详细]
  • CentOS 7.6环境下Oracle 11g的数据泵操作与nmon性能监控
    本文详细介绍在CentOS 7.6操作系统中使用Oracle 11g的数据泵(Data Pump)进行数据的导入导出操作,并介绍如何通过nmon工具进行系统性能的监控与分析。 ... [详细]
  • 本文档详细介绍了如何在MongoDB命令行中执行基本操作,包括数据库的选择与创建、文档的插入与查询、文档的更新与删除等。同时,还涵盖了条件查询、统计、模糊查询等高级功能。 ... [详细]
  • 本文探讨了SQL查询执行缓慢的多种可能因素,并提供了详细的解释和解决方案。 ... [详细]
  • 本文档详细规划了从基础到高级的软件测试学习路径,包括但不限于测试基础、Linux和数据库、功能测试、Python编程、接口测试、性能测试、金融项目实战、UI自动化测试等内容,旨在为初学者和进阶者提供全面的学习指导。 ... [详细]
author-avatar
来人把老师拖出I去毙了
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有