2011-05-17 42 views
0

我在我的辦公室運行Oracle 9i服務器。我正在處理一個將sys_refcursor作爲out參數傳遞給另一個包(以及其他參數)的過程。我能夠將類型定義爲被調用過程在遊標中返回的各個列的記錄。然後我可以用這樣的代碼循環:從存儲過程中的sys_refcursor獲取特定字段?

LOOP 
    fetch o_results into v_rec; 
    exit when o_results%notfound; 
    dbms_output.put_line(v_rec.some_id); 
end loop; 

有沒有辦法只拉一列而不必聲明整個rowtype?我試過類似的東西:

LOOP 
    fetch o_results.some_id into v_id; 
    exit when o_results%notfound; 
    dbms_output.put_line(v_id); 
end loop; 

但這並不奏效。任何其他想法?

回答

1

不,如果遊標返回一個包含多列的結果集,則不能將單個列讀取到記錄以外的局部變量中。但是,您確實有幾個選擇。

如果聲明強類型的遊標而不是弱類型的遊標,則可以根據該遊標定義聲明局部變量,而不是聲明新的集合。

create or replace procedure cursor_proc 
as 
    cursor emp_cur 
     is 
    select empno, ename 
    from emp; 
    l_row emp_cur%rowtype; 
begin 
    open emp_cur; 
    loop 
    fetch emp_cur into l_row; 
    exit when emp_cur%notfound; 
    dbms_output.put_line(l_row.ename); 
    end loop; 
    close emp_cur; 
end; 

或者,如果你知道弱類型REF光標總是返回特定對象中的所有列,可以錨您的局部變量聲明到該對象。你總是可以通過聲明一個你的光標從中選擇的視圖來完成這項工作。例如

create or replace view vw_emp 
as 
select ename, empno 
    from emp 

create or replace procedure cursor_proc2 
as 
    emp_cur sys_refcursor; 
    l_row vw_emp%rowtype; 
begin 
    open emp_cur for select * from vw_emp; 
    loop 
    fetch emp_cur into l_row; 
    exit when emp_cur%notfound; 
    dbms_output.put_line(l_row.ename); 
    end loop; 
    close emp_cur; 
end; 

最後,如果您使用的是隱式遊標,Oracle將隱式聲明的集合類型

create or replace procedure cursor_proc3 
as 
begin 
    for emp in (select ename, empno from emp) 
    loop 
    dbms_output.put_line(emp.ename); 
    end loop; 
end; 
相關問題