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

Вопрос:

У меня есть этот анонимный блок 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: время ожидания при ожидании блокировки объекта

В чем проблема??? Пожалуйста !

Лучший ответ:

Похоже на проблему ddl_lock

Взгляни на
dba_ddl_locks чтобы узнать, кто “блокирует” создание или замену.

Также попробуйте создать под другим именем – и посмотреть, что произойдет.

Ответ №1

Проблема состояла в том, что объект GET_UNIT_RETAIL был занят другой средой. Вот ответ:

Оцените статью
Добавить комментарий