2012-02-24 13 views
4

複数の値が返された場合、どのようにしてカーソルの特定の値を参照できますか?無名ブロック内のカーソルの参照

DECLARE 
    X INTEGER; 
    CURSOR c1 IS SELECT col1, col2, col3.....; 
BEGIN 
    OPEN c1; 
    LOOP 
    EXIT WHEN c1%NOTFOUND; 
    FETCH (col2 from c1) INTO X; 
    END LOOP; 
END; 

答えて

10

なぜしたいですか?あなたは、カーソル宣言で3つの列を選択している場合は、3つの別々のローカル変数にすべての3つの列を取得する必要がありますので、おそらく、あなたは、あなたのコード内のすべての3つの列を必要とする、すなわち

DECLARE 
    x  integer; 
    y  integer; 
    z  integer; 
    CURSOR c1 
     IS SELECT column1, column2, column3 
      FROM some_table; 
BEGIN 
    OPEN c1; 
    LOOP 
    FETCH c1 
    INTO x, y, z; 
    EXIT WHEN c1%NOTFOUND; 
    END LOOP; 
    CLOSE c1; 
END; 

代わりに、あなたが宣言することができますレコード型カーソル宣言に基づいており、また、あなたはカーソル漏れを心配する必要はありかつ(現代ではないので、一般的に好ましい方法である完全に明示的なループを取り除くことができる

DECLARE 
    CURSOR c1 
     IS SELECT column1, column2, column3 
      FROM some_table; 
    c1_rec c1%ROWTYPE; 
BEGIN 
    OPEN c1; 
    LOOP 
    FETCH c1 
    INTO c1_rec; 
    dbms_output.put_line(c1_rec.column2); 
    EXIT WHEN c1%NOTFOUND; 
    END LOOP; 
    CLOSE c1; 
END; 

にフェッチバージョン)Oracleは自動的にバルク収集を行います

DECLARE 
    CURSOR c1 
     IS SELECT column1, column2, column3 
      FROM some_table; 
BEGIN 
    FOR c1_rec IN c1 
    LOOP 
    dbms_output.put_line(c1_rec.column2); 
    END LOOP; 
END; 
関連する問題