【问题标题】:How to set timeout for anonoymous block or query in plsql?如何在pl sql中为匿名块或查询设置超时?
【发布时间】:2013-12-29 10:18:07
【问题描述】:

我知道您可以设置用户 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;

这可能吗?我可以捕捉到任何超时异常吗?每个块或查询?没有找到关于该主题的太多信息。

【问题讨论】:

    标签: sql oracle plsql oracle11g


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 请做好准备,运行此作业的会话不会立即终止。它必须首先回滚所做的所有更改。回滚可能需要比更新/删除更多的时间。
      【解决方案3】:

      你可以这样做:

      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:资源繁忙;acquire with WAIT timeout expired”。如果锁定成功,则可以执行删除。

      希望对您有所帮助。

      【讨论】:

        【解决方案4】:
        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;
        

        【讨论】:

        • 欢迎来到 Stack Overflow!虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
        【解决方案5】:
        MariaDB> select sleep(4);
        +----------+
        | sleep(4) |
        +----------+
        |        0 |
        +----------+
        1 row in set (4.002 sec)
        
        MariaDB>
        

        见:https://mariadb.com/kb/en/sleep/

        【讨论】:

        • 这不是 MariaDB 问题。
        猜你喜欢
        • 2014-09-30
        • 2018-07-19
        • 1970-01-01
        • 2017-01-29
        • 2017-09-02
        • 1970-01-01
        • 1970-01-01
        • 2012-12-05
        • 1970-01-01
        相关资源
        最近更新 更多