2016-04-30 11 views
0

こんにちは私はデータベースとPL/SQLを初めて使っています。今はカーソルの使い方を学んでいます。無限ループPL/SQLを修正しました。 Cursos。 c%NOTFOUNDが機能しないときに終了する

私の問題は、Oracle SQL Developerで次のコードを実行すると無限ループが発生するということです。カーソルが行われたときにEXIT WHEN c1%NOTFOUND叫びは、ループの外に私を得るために奇妙な

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; 

どのような考えですか?

+2

ループ内のカーソルから別の行をフェッチしていません。 –

+2

カーソルの学習を始めるべきではありません。ここでのようなデータにカーソルを使用する理由はほとんどありません。 SQLスキルを向上させるには、単にCOUNT(*)OVER()やRATIO_TO_REPORTのような分析関数を適用するだけです – dnoeth

答えて

1

FETCH c1 INTO <variables>句を使用する必要があります。

open-fetch-closeルーチンを使用しない暗黙的なカーソルを使用することもできます。

ところで、count(*), avg(precio)機能の列エイリアスを使用することができます。

関連する問題