ORA-04021:等待锁定对象时发生超时

时间:2016-08-20 07:46:14

标签: oracle plsql sqlplus

我有这个匿名的PL / SQL块,用于计算和打印表中的值返回值。

DECLARE
    U_ID NUMBER :=39;
    RETAIL BINARY_FLOAT:=1;
    FLAG NUMBER;
BEGIN
    SELECT NVL(RETAIL_AMOUNT,1),UNIT_ID INTO RETAIL, FLAG FROM UNITS WHERE UNIT_ID=U_ID;
    LOOP
    SELECT NVL(MAX(UNIT_ID),U_ID) INTO FLAG FROM  UNITS WHERE FATHER_ID=FLAG;
    IF FLAG=U_ID THEN EXIT; END IF;
    SELECT RETAIL* RETAIL_AMOUNT INTO RETAIL FROM UNITS WHERE UNIT_ID=FLAG;
    EXIT WHEN FLAG=U_ID;
    END LOOP;
DBMS_OUTPUT.PUT_LINE( RETAIL);
END;

这个块正常工作,但我想用PL / SQL函数做同样的事情

我写了这个函数如下:

CREATE OR REPLACE FUNCTION GET_UNIT_RETAIL(U_ID NUMBER)
     RETURN NUMBER
IS
    RETAIL BINARY_FLOAT:=1;
    FLAG NUMBER;
BEGIN
    SELECT NVL(RETAIL_AMOUNT,1),UNIT_ID 
    INTO RETAIL, FLAG 
    FROM UNITS 
    WHERE UNIT_ID=U_ID;

    LOOP
        SELECT NVL(MAX(UNIT_ID),U_ID) 
        INTO FLAG 
        FROM  UNITS 
        WHERE FATHER_ID=FLAG;
        IF FLAG=U_ID THEN 
            EXIT; 
        END IF;
        SELECT RETAIL* RETAIL_AMOUNT 
        INTO RETAIL 
        FROM UNITS 
        WHERE UNIT_ID=FLAG;
        EXIT WHEN FLAG=U_ID;
    END LOOP;

    RETURN NUMBER;
END;
/

当我尝试执行上面的代码将函数保存到数据库时,环境(SQL * PLUS)会挂起很长时间,并在最后返回此错误:

  

第1行的错误:
  ORA-04021:等待锁定对象时发生超时

有什么问题?拜托!

2 个答案:

答案 0 :(得分:3)

听起来像 ddl_lock 问题

看看
dba_ddl_locks查看谁“阻止”创建或替换。

还尝试在 其他名称 下创建 - 并查看会发生什么。

答案 1 :(得分:0)

问题是因为对象GET_UNIT_RETAIL忙于其他环境 这是答案:

https://community.oracle.com/thread/2321256