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.
Vous devez vous connecter pour publier un commentaire.
Sonne comme ddl_lock problème
Regardez
dba_ddl_locks
pour voir qui est le "blocage" une création ou remplacement.Aussi essayer de créer des sous nom différent - et de voir ce qui se passe.
create or replace
.Le problème était que l'Objet
GET_UNIT_RETAIL
était occupé par d'autres de l'environnementVoici la réponse:
https://community.oracle.com/thread/2321256