如何在plsql中设置异常块或查询的超时?

如何在plsql中设置异常块或查询的超时?,sql,oracle,plsql,oracle11g,Sql,Oracle,Plsql,Oracle11g,我知道您可以设置用户或设置查询的常规超时 但我希望将timeout设置为过程中的特定查询,并捕获异常,例如: begin update tbl set col = v_val; --Unlimited time delete from tbl where id = 20; --Unlimited time begin delete from tbl; -- I want this to have a limited time to p

我知道您可以设置用户或设置查询的常规超时

但我希望将timeout设置为过程中的特定查询,并捕获异常,例如:

begin
      update tbl set col = v_val; --Unlimited time
      delete from tbl where id = 20; --Unlimited time

      begin
            delete from tbl; -- I want this to have a limited time to perform
            exception  when (timeout???) then
            --code; 

      end;

end;

这可能吗?我能捕捉到任何超时异常吗?每个区块还是查询?找不到有关该主题的详细信息。

不,不能在pl/sql中设置超时。您可以使用一种宿主语言,在其中嵌入sql和pl/sql。

只是一个想法:您可以在一个DBMS\u作业中执行删除操作。 然后创建监视作业的过程,该过程将调用:

DBMS_JOB.BROKEN(JOBID,TRUE);
DBMS_JOB.remove(JOBID);
你可以做:

select * from tbl for update wait 10; --This example will wait 10 seconds.  Replace 10 with number of seconds to wait
然后,select将尝试锁定指定的行,但如果n秒后不成功,它将抛出“ORA-30006:资源繁忙;等待超时过期时获取”。如果实现了锁定,则可以执行删除


希望这会有所帮助。

请做好准备,运行此作业的会话不会立即终止。它必须首先回滚所做的所有更改。回滚可能比更新/删除花费更多的时间。欢迎使用堆栈溢出!虽然这个代码片段可以解决这个问题,但它确实有助于提高文章的质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码建议的原因。
v_timer1 := dbms_utility.get_time();

  WHILE TRUE 
  LOOP

    v_timer2 := dbms_utility.get_time();

    EXIT WHEN (ABS(v_timer1 - v_timer2)/100) > 60;  -- cancel after 60 sec.
  END LOOP;