2016-04-30 72 views
0

你好我是數據庫和PL/SQL的新手,現在我正在學習如何使用遊標。修復無限循環PL/SQL。 Cursos。 c%NOTFOUND無法正常工作時退出

我的問題是,當我在Oracle SQL Developer中執行以下代碼時,我得到一個無限循環。

set serveroutput on 

DECLARE 

CURSOR c1 
IS 
    select tipoanimal, count(*), avg(precio) 
    from mi_cursos 
    group by tipoanimal; 

    xtotal_cursos number; 
    xtipo_tipoanimal mi_cursos.tipoanimal%type; 
    xcuenta_curso_animal number; 
    xprecio_medio_curso_animal number; 
    total_porcentaje number; 

BEGIN 
    select count(*) into xtotal_cursos from mi_cursos; 

    OPEN c1; 

    LOOP 
    EXIT WHEN c1%NOTFOUND; 
    total_porcentaje:= xcuenta_curso_animal/xtotal_cursos*100; 
    dbms_output.put_line(rpad(xtipo_tipoanimal,10,' ')|| 
    lpad(to_char(xcuenta_curso_animal,'999999'),10,' ')|| 
    lpad(to_char(total_porcentaje,'99999.99'),10,' ')|| 
    lpad(to_char(xprecio_medio_curso_animal, '999999'),10,' ')); 
    END LOOP; 

    CLOSE c1; 

EXCEPTION 
    WHEN OTHERS THEN 
    dbms_output.put_line('Error -10: error no conocido'); 
    dbms_output.put_line('Error Oracle ' || TO_CHAR(SQLCODE) || ' Mensaje: ' || SUBSTR(SQLERRM,1,200)); 
END; 

,由於EXIT WHEN c1%NOTFOUND喊讓我圈外當光標完成的怪異。

有什麼想法?

+2

您不會從循環內的光標中提取另一行。 –

+2

您不應該開始學習遊標,在這裏的數據上幾乎沒有任何理由使用遊標。更好地提高你的SQL技能,你只需要應用一個像COUNT(*)OVER()或RATIO_TO_REPORT這樣的分析函數 – dnoeth

回答

1

您應該使用FETCH c1 INTO <variables>子句。

也可以使用隱式遊標而無需打開讀取關閉例程。

順便說一句,使用可以給出count(*), avg(precio)函數的列別名。