2016-08-20 259 views
0

不好意思!ORA-04021:等待锁定对象时发生超时

我有这个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)挂起很长时间并在最后返回此错误:

ERROR位于第1行:

ORA-04021:?!而等待锁定对象

有什么问题发生超时。请..

+0

我会假设,因为退出条件是不正确的,你有一个无限循环的问题。但是你处于最好的位置来检验逻辑并解释这里发生的事情。 –

+0

没有无限循环,查看前面的代码,代码正确执行,并以相同的方式执行相同的操作。 –

+0

'环境(SQL * PLUS)hangup' ...那么这是什么意思? –

回答

1

听起来ddl_lock问题

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

也可以尝试下不同的名称创造 - 看看会发生什么。

+0

最后SQL * PLUS返回: 错误在第1行: ORA-04021:等待锁定对象时发生超时。 这是什么意思?请! –

+0

@SaddamMeshaal它意味着Oracle认为你正在使用的资源正在被使用..它等待锁被释放(这就是为什么它会'挂起')并最终超时。非常简单的临时解决方案 - 更改功能名称并重新运行。更复杂的长期解决方案是确定使用资源的人员,停止使用(通过杀死会话或更微妙地),然后运行“创建或替换”。 – Plirkee

相关问题