ora-00054 resource busy

ora-00054 resource busy. Loop this function when you get ora-00054.

Last updated:

Warning: Review and test in a non-production environment before running.

Back to results

FUNCTION  get_resource_busy ( p_recordKey   IN NUMBER,
                              p_table_name  IN VARCHAR2)
          RETURN NUMBER
IS
  v_Status         NUMBER:=0;
  v_sql_QUERY      VARCHAR2(2000);
  c_max_wait_count CONSTANT:=10;
  v_wait_count     number:=0;
 
  resource_busy       EXCEPTION;
  PRAGMA EXCEPTION_INIT(resource_busy,-54);
 
 BEGIN

    v_sql_QUERY :=
    ' select RecordKey from ' || p_table_name ||
    ' where RecordKey =  ' || p_recordKey ||
    ' for update nowait'; 

   BEGIN
    
      EXECUTE IMMEDIATE v_sql_QUERY INTO v_Status;
     
   EXCEPTION
     WHEN resource_busy  THEN
        IF v_wait_count > c_max_wait_count THEN
            v_Status    := -99;
            goto  end_Func;
        ELSE
            dbms_lock.sleep(5);  -- wait another 5 seconds
            v_wait_count := v_wait_count + 1;
        END IF;
     WHEN others THEN
        v_Status := sqlcode;
   END;
 
   <<end_Func>>

   RETURN v_Status;

END get_resource_busy;