如何在pl sql中设置匿名块或查询的超时?

时间:2013-12-11 12:29:53

标签: sql oracle plsql oracle11g

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

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

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;

这可能吗?是否有任何超时异常我可以抓住?每个块还是查询?没有找到关于这个主题的太多信息。

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

DBMS_JOB.BROKEN(JOBID,TRUE);
DBMS_JOB.remove(JOBID);

答案 2 :(得分:0)

你可以这样做:

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:资源忙;获取WAIT超时已到期”。如果达到锁定,则可以执行删除。

希望有所帮助。

答案 3 :(得分:0)

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;