【问题标题】:Oracle - Obtain the SQL as a string when an exception occursOracle - 发生异常时以字符串形式获取 SQL
【发布时间】:2012-05-13 15:14:21
【问题描述】:

当查询无法执行并且返回游标处于失败状态时,我正在尝试从数据库调用中返回 SQL 查询。此查询字符串将用于记录目的。

这样做的一种方法是将包含 SQL 查询的变量保存为字符串,然后使用异常处理程序将每个查询包装在 PL/SQL 块中,如果出现异常,则返回失败的查询字符串状态到 UI 组件。

有没有更好的方法来做到这一点? Oracle 异常对象或任何其他包是否支持此功能?

这个问题似乎与线程重复:Obtain the Query/CommandText that caused a SQLException

但是,我没有在该线程中找到问题的解决方案,我想知道是否有任何 Oracle 支持的新包为我们提供导致异常发生的查询字符串。

【问题讨论】:

  • stackoverflow.com/a/493590/409172 可能会有所帮助。虽然如果您正在调用运行 SQL 的过程,它可能会记录该过程调用而不是真正导致失败的 SQL。
  • 您希望 PL/SQL 块或外部块之外执行此操作,对吗?即,如果您在 SQL*Plus 中运行 select * from duala;,它将被记录到某个地方?
  • @jonearles,我会通读一遍,如果它有效,请告诉你,谢谢!
  • @Ben,我没看懂你的想法,能否详细说明一下?
  • @Shankar,这不是一个想法,而是一个问题!您是否希望运行每个 SQL 查询,如果失败,无论从哪里记录它?您在哪里调用存储过程/查询,并且在您的 cmets 中与答案相矛盾时,它明确是哪个?

标签: sql oracle exception


【解决方案1】:

当您从外部语言(Java、C#)调用数据库时,您可以通过实现自己的 JDBC(或其他)驱动程序来实现。

您可以通过将现实世界委托给普通驱动程序来做到这一点,但是每当将语句发送到数据库时,您都会记住该语句,并且如果导致异常,您将创建一个新异常,该异常还包括 sql 语句(并且可能绑定变量)。

请注意,这只会给您您的陈述。如果您执行存储过程或触发触发器,而触发器又失败了,您只会得到原始语句,而不是实际失败的语句。

【讨论】:

  • 是的,我正在尝试调用存储过程。所以,我不知道如何获取失败的查询
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-27
  • 2016-02-20
  • 2011-10-25
  • 2021-02-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多