對於一個項目,我需要根據該屬性的值修改表中的某些屬性。我決定去使用遊標,並寫道:當通過光標循環時PL/SQL錯誤ORA-01722
DECLARE
totale_rente rekening.saldo%TYPE;
cursor c_boven1000 is
select r.reknummer,
r.saldo,
rt.rentepercentage,
ABS(ROUND(r.saldo * (rt.rentepercentage/100), 2)) as teBetalen
FROM rekening r
join rekeningtype rt on rt.naam = r.rekeningtype
Where r.saldo < 0 and saldo >= -1000;
cursor c_onder1000 is
select r.reknummer,
r.saldo,
rt.rentepercentage,
ABS(ROUND(r.saldo * ((rt.rentepercentage*2)/100), 2)) as teBetalen
From rekening r
join rekeningtype rt on rt.naam = r.rekeningtype
Where r.saldo < -1000;
TYPE rek_saldo IS TABLE OF rekening.saldo%TYPE;
TYPE rek_nummer IS TABLE OF rekening.reknummer%TYPE;
TYPE type_percentage IS TABLE OF rekeningtype.rentepercentage%TYPE;
TYPE rek_tebetalen IS TABLE OF rekening.saldo%TYPE;
rek_saldos rek_saldo;
rek_nummers rek_nummer;
type_percentages type_percentage;
rek_tebetalens rek_tebetalen;
BEGIN
OPEN c_boven1000;
FETCH c_boven1000 BULK COLLECT INTO rek_saldos, rek_nummers, type_percentages, rek_tebetalens;
CLOSE c_boven1000;
FOR x IN rek_nummers.first..rek_nummers.last LOOP
UPDATE rekening r
SET r.saldo = r.saldo - rek_tebetalens(x)
WHERE r.reknummer = rek_nummers(x);
totale_rente := totale_rente + rek_tebetalens(x);
END LOOP;
OPEN c_onder1000;
FETCH c_onder1000 BULK COLLECT INTO rek_saldos, rek_nummers, type_percentages, rek_tebetalens;
CLOSE c_onder1000;
FOR x IN rek_nummers.first..rek_nummers.last LOOP
UPDATE rekening r
SET r.saldo = r.saldo - rek_tebetalens(x)
WHERE r.reknummer = rek_nummers(x);
totale_rente := totale_rente + rek_tebetalens(x);
END LOOP;
UPDATE rekening r
SET saldo = saldo + totale_rente
WHERE r.reknummer = '2250';
END;
在這種情況下,reknummer
是一個VARCHAR,saldo
是一個數字(10,2),rentepercentage
是一個數字(3,2)。
執行的時候,我得到了以下錯誤:如果
ORA-01722: Invalid number for execute PL/SQL code.
不知道這是重要的,但是這個代碼塊是一個動態的動作在裏面點擊一個按鈕。 我試圖找到我的錯誤,但一直無法。 任何人都可以協助嗎?
這是一個完整的錯誤消息? – massko
我的第一個建議是重新考慮你的算法。您打開光標兩次以檢索一條記錄。這可以在沒有遊標的情況下完成(遊標旨在檢索數據集/記錄集合,然後逐個循環)。一旦您更改了代碼並消除了所有錯誤(包括01722),請使用更多信息更新您的問題。 – FDavidov
我使用基於屬性rekening.saldo的值的兩個不同的遊標,因爲如果saldo <-1000,rekening.saldo的新值需要使用雙重值rekeningtype.rentepercentage來計算。我不知道這樣做的另一種方式。你有什麼建議如何做不同? –