2016-08-20 256 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

相關問題