我有这个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)挂起很长时间并在最后返回此错误:
ERROR位于第1行:
ORA-04021:?!而等待锁定对象
有什么问题发生超时。请..
我会假设,因为退出条件是不正确的,你有一个无限循环的问题。但是你处于最好的位置来检验逻辑并解释这里发生的事情。 –
没有无限循环,查看前面的代码,代码正确执行,并以相同的方式执行相同的操作。 –
'环境(SQL * PLUS)hangup' ...那么这是什么意思? –