假设有个A表被锁住了。
我有语句是这样的:
DECLARE
   c INT;
BEGIN
   SELECT c_1 INTO c FROM A FOR UPDATE WAIT 10;
   IF SQLCODE <> 0 THEN
      dbms_output.put_line('超时啦!');
   END IF;
END;我是想判断到是否超时,但是实际执行的时候是直接报错的,不会输出“超时”文本。
请问这个如何实现?
其实就是想处理并发时的一个返回。

解决方案 »

  1.   

    出异常了,捕获异常。根据异常代码来处理DECLARE
      c INT;
    BEGIN
      SELECT c_1 INTO c FROM A FOR UPDATE WAIT 1;
    EXCEPTION
      WHEN others THEN
        dbms_output.put_line(SUBSTR(SQLERRM, 1, 120));
        dbms_output.put_line(SQLCODE);
        dbms_output.put_line('超时啦!');
        --END IF;
    END;
      

  2.   

    今天自己上午再试各种方法,发现是要用异常来捕获。
    这里我顺便再问一个问题,在sql server中,如果一个事务内要对两个表进行增删改的话,可以在每条sql语句后通过@@error来判断,但是在oracle中比如:
    insert into t1 values(...);
    insert into t2 values(...);exception
       when others then
           ...假设发生异常的话,我如何能得知是在插入t1还是插入t2时发生的异常???
      

  3.   

    DECLARE
       c INT;
    BEGIN
       SELECT comm INTO c FROM emp WHERE comm='300.00' FOR UPDATE WAIT 10;
       IF SQLCODE <> 1 THEN
       dbms_output.put_line(SQLCODE);
          dbms_output.put_line('超时啦!');
       END IF;
    END;
    结果在返回值那块的,可能是c_1你选择出了多个的值,你把这多个的值赋值给了c ,所以报错了。上面的是我修改后的语句,可以执行出结果的
      

  4.   

    之前的问题搞明白了,现在就是这个不清楚:
    在sql server中,如果一个事务内要对两个表进行增删改的话,可以在每条sql语句后通过@@error来判断,但是在oracle中比如:
    insert into t1 values(...);
    insert into t2 values(...);exception
       when others then
           ...假设发生异常的话,我如何能得知是在插入t1还是插入t2时发生的异常???
      

  5.   


    begin
    insert into t1 values(...);
    exception
       when others then
      ...
    end;begin
    insert into t2 values(...);
    exception
       when others then
      ...
    end;