2016-11-09 59 views
0

對於一個項目,我需要根據該屬性的值修改表中的某些屬性。我決定去使用遊標,並寫道:當通過光標循環時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.

不知道這是重要的,但是這個代碼塊是一個動態的動作在裏面點擊一個按鈕。 我試圖找到我的錯誤,但一直無法。 任何人都可以協助嗎?

+0

這是一個完整的錯誤消息? – massko

+0

我的第一個建議是重新考慮你的算法。您打開光標兩次以檢索一條記錄。這可以在沒有遊標的情況下完成(遊標旨在檢索數據集/記錄集合,然後逐個循環)。一旦您更改了代碼並消除了所有錯誤(包括01722),請使用更多信息更新您的問題。 – FDavidov

+0

我使用基於屬性rekening.saldo的值的兩個不同的遊標,因爲如果saldo <-1000,rekening.saldo的新值需要使用雙重值rekeningtype.rentepercentage來計算。我不知道這樣做的另一種方式。你有什麼建議如何做不同? –

回答

2

您選擇列的順序和變量的順序是不一樣的。

select r.reknummer 
     ,r.saldo 
     ,rt.rentepercentage 

into rek_saldos 
      ,rek_nummers 
      ,type_percentages 

您可以在光標用一個case語句這樣:

select r.reknummer 
     ,r.saldo 
     ,rt.rentepercentage 
     ,case 
      when saldo >= -1000 then 
      abs(round(r.saldo * (rt.rentepercentage/100), 2)) 
      else 
      abs(round(r.saldo * ((rt.rentepercentage * 2)/100), 2)) 
     end as tebetalen 
    from rekening r 
    join rekeningtype rt 
    on rt.naam = r.rekeningtype 
where r.saldo < 0 
+0

感謝您清理它,它始終是最難以發現的小事情。它現在正按預期完美工作。 –