为 PLSQL 块或过程中的查询设置超时?

Posted

技术标签:

【中文标题】为 PLSQL 块或过程中的查询设置超时?【英文标题】:Set timeout for PLSQL block or query inside procedure? 【发布时间】:2021-03-17 09:47:02 【问题描述】:

我知道我们可以在架构级别使用资源管理器设置超时。但我想为过程中的特定查询设置超时并捕获异常。假设我想在 15 秒后停止执行特定查询的查询。有什么办法吗?或者任何可用的超时异常?我正在使用 Oracle Db 12.2。谢谢。

【问题讨论】:

您需要在 PL/SQL 或应用程序中捕获异常吗?使用ALTER SYSTEM CANCEL SQL 命令可以间接停止查询或过程,但该命令会引发异常ORA-01013: user requested cancel of current operation,PL/SQL 无法捕获该异常。 @JonHeller 我需要在 PL/SQL 中捕获异常。我也在使用 Oracle 12.2 Db,而我认为 ALTER SYSTEM CANCEL SQL 命令在 Oracle 18c 中引入。 无法在同一个 PL/SQL 块中捕获异常,您可能需要执行类似于 Littlefoot 的解决方案并使用异步调度程序作业并检查状态。 ALTER SYSTEM CANCEL SQL 命令应该在 12.2 中有效,尽管它没有记录。 【参考方案1】:

据我所知,没有这样的事情。

但是,看看这是否有帮助:

不是运行程序本身,而是安排它(使用dbms_scheduler) 然后,通过查询dba_scheduler_running_jobs找到工作 最后,如果你认为它运行时间过长,杀死它(使用dbms_scheduler.stop_job

是的,我知道 - 您说的是过程中的查询。它使事情变得更加复杂,因为过程的其余部分应该等待特定查询(现在转换为作业)完成。


但是,如果它是一个循环,您可以设置一个计时器并在每次循环迭代中检查它,然后如果它运行时间超过 15 秒则退出循环。也许您可以进行该查询以使用您输入的条件,例如游标 FOR 循环的 where 子句 ...

【讨论】:

首先感谢您的回复。不,我不能让它安排工作。实际上我的场景是有一些复杂的读取数据过程,这些过程基于一些复杂的 sql 查询,并且没有循环涉及。这些过程调用包括来自前端的不同输入参数。我只想对某些程序设置时间限制,如果超过该时间则取消查询执行,引发异常并在前端显示该异常,而不是最终用户等待几分钟。 不客气。不幸的是,正如我所说,我不知道 Oracle 中是否存在您需要的东西。希望其他人能够提供帮助。

以上是关于为 PLSQL 块或过程中的查询设置超时?的主要内容,如果未能解决你的问题,请参考以下文章

PLSQL 过程中的查询必须返回 1 行,但返回更多行

经典问题:ORA-12170:TNS:连接超时!求解决办法。

PLSQL 中的动态查询错误

PLSQL:在存储过程中使用动态查询时不显示输出

plsql查询数据显示为乱码解决方法

plsql查询中'%%'是模糊查询吗?为啥查不出来呢?