2009-07-09 86 views
4

我有一個函數返回REF CURSOR到一個RECORD的包。我試圖從一個代碼塊調用這個函數。調用代碼如下所示:從函數返回一個參考光標到記錄

declare  
    a_record package_name.record_name; 
    cursor c_symbols is select package_name.function_name('argument') from dual; 

begin 
    open c_symbols; 
    loop    
     fetch c_symbols into a_record; 
     exit when c_symbols%notfound;    
    end loop; 
    close c_symbols; 
end; 

函數聲明爲程序包的一部分,看起來是這樣的:

TYPE record_name IS RECORD(
     field_a  varchar2(20); 
); 

TYPE record_cursor IS REF CURSOR RETURN record_name; 

FUNCTION getsymbols(argument IN varchar2) return record_cursor; 

當我嘗試運行調用的代碼塊,我得到異常:PLS- 00386:在FETCH遊標和INTO變量之間的'EXAMPLE_SYMBOLS'處發現類型不匹配。

a_record的類型應該是什麼,以及如何訪問我正在提取的記錄(類型爲record_name)的單個元素?

回答

7

我懷疑你認爲你的光標應該從REFCURSOR中獲取行。不是。 REFCURSOR本身就是一個光標,你不用另一個光標從中進行選擇。

你當前的遊標正在做的是獲取一行,包含函數調用結果的單個列。這是一個record_cursor而不是record_name,所以你得到一個類型不匹配。

我懷疑你真正想要做的是這樣的:

declare 
    symbol_cursor package_name.record_cursor; 
    symbol_record package_name.record_name; 
begin 
    symbol_cursor := package_name.function_name('argument'); 
    loop 
    fetch symbol_cursor into symbol_record; 
    exit when symbol_cursor%notfound; 

    -- Do something with each record here, e.g.: 
    dbms_output.put_line(symbol_record.field_a); 

    end loop; 

    CLOSE symbol_cursor; 

end; 
+0

如果我的函數返回一個指針到多個記錄?有什麼方法可以遍歷這些記錄。 – neesh 2009-07-13 15:01:46

0

該函數返回record_cursor,所以我期望a_record也應該是record_cursor。但是,不清楚爲什麼你要返回一個參考遊標 - 爲什麼函數不能返回record_name類型呢?

0

讀取參考光標的pl/sql塊看起來有點奇怪。 Oracle可能無法將光標類型c_symbols與類型package_name.record_cursor相匹配。

建議:

  • 變化c_symbols申報爲 「c_symbols package_name.record_cursor
  • 與 「c_symbols := package_name.function_name('argument')

替代語句 「open c_symbols」 只要被調用的函數確實返回遊標,這應該工作。 否則,你可能想發佈實際的源代碼。