2012-02-24 44 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;