2012-02-24 32 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列,你需要的所有三列在你的代码,所以你需要将所有的三列取成三个独立的局部变量,即

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;