我有這個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' ...那麼這是什麼意思? –