ORA-04021: délai d'attente s'est produite lors de l'attente de verrouillage de l'objet

J'ai cette anonyme PL/SQL bloc qui calcule et imprime une valeur de retour à partir d'une table.

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;

Ce bloc fonctionne correctement, mais j'ai voulu faire la même chose à l'aide d'une Fonction PL/SQL

J'ai écrit la fonction comme suit:

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;
/

Lorsque j'essaie d'exécuter le code ci-dessus pour enregistrer la fonction de la base de données, de l'environnement (SQL*PLUS) se bloque pendant une longue période et à la fin retourne cette erreur:

ERREUR à la ligne 1:

ORA-04021: délai d'attente s'est produite lors de l'attente pour verrouiller l'objet

Quel est le problème ??? S'il vous plaît !

  • Je suppose que vous avez une boucle infinie problème parce que la condition de sortie n'est jamais vrai. Mais vous êtes dans la meilleure position pour disect la logique et les expliquer ce qui se passe ici.
  • il n'y a pas de boucle infinie, regardez le code précédent, le code s'exécuter correctement, et faire la même chose par le même chemin.
  • the environment (SQL*PLUS) hangup ... alors que voulez-vous dire par cela?
  • Je suppose qu'il voulait dire, il se bloque.