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