ORA-04021: 等待锁定对象时发生超时
ORA-04021: timeout occurred while waiting to lock object
我有这个匿名 PL/SQL 块,它从 table.
计算并打印值 return
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) 挂了很长时间,最后 returns 这个错误:
ERROR at line 1:
ORA-04021: timeout occurred while waiting to lock object
有什么问题吗???请!
听起来像 ddl_lock 问题
看看
dba_ddl_locks
看看谁是 "blocking" 创建或替换。
也尝试在 不同的名称 下创建 - 看看会发生什么。
问题是因为对象 GET_UNIT_RETAIL
正被其他环境占用
答案如下:
我有这个匿名 PL/SQL 块,它从 table.
计算并打印值 returnDECLARE
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) 挂了很长时间,最后 returns 这个错误:
ERROR at line 1:
ORA-04021: timeout occurred while waiting to lock object
有什么问题吗???请!
听起来像 ddl_lock 问题
看看
dba_ddl_locks
看看谁是 "blocking" 创建或替换。
也尝试在 不同的名称 下创建 - 看看会发生什么。
问题是因为对象 GET_UNIT_RETAIL
正被其他环境占用
答案如下: