2016-12-29 67 views
0

我的函數應該返回一個問題,應該返回一個表。但是,當我想運行這個函數時,返回錯誤「不正確的數據類型」。無論如何,包是compilling權。從PL/SQL函數返回一個表 - 不正確的數據類型

我不知道問題出在哪裏。

這裏是我的代碼:

create or replace package PKG_BORROW as 
    type advertisement_header is record(
    id_advertisment number, 
    title varchar2(100), 
    date_added timestamp, 
    username varchar2(100), 
    regionName varchar2(100), 
    id_category number 
    ); 
    type adv_head_tab is table of advertisement_header; 



    enter code here 

    function get_adv_header_filter 
    (title varchar2,username varchar2,regionName varchar2,categoryName varchar2) 
    return adv_head_tab; 

    end ; 

/
    create or replace package body PKG_BORROW 
    as 

    function get_adv_header_filter 
    (title varchar2,username varchar2,regionName varchar2,categoryName varchar2) 
    return adv_head_tab as 
    l_tab adv_head_tab := adv_head_tab(); 
    query varchar2(500); 
    TYPE CurTyp IS REF CURSOR; 
    v_adv_cursor CurTyp; 

    begin 
    query:='select a.id_advertisement,a.title,a.date_added,a.id_user,r.name,i.id_item_category from advertisement a,region r,item_category i 
    where a.id_region=r.id_region and a.id_item_category=i.id_item_category '; 

    open v_adv_cursor for query; 
    loop 
     fetch v_adv_cursor into l_tab(l_tab.last); 
     exit when v_adv_cursor%NOTFOUND; 
    end loop; 
    close v_adv_cursor; 
    dbms_output.put_line(l_tab(1).title); 
    return l_tab; 
    end; 

end ; 

/
    select * from TABLE(PKG_BORROW.get_adv_header_filter('a','a','a','a')); 

/
    declare 
    TYPE CurTyp IS REF CURSOR; 
    v_adv_cursor CurTyp; 
    begin 
    open v_adv_cursor for PKG_BORROW.get_adv_header_filter('a','a','a','a'); 

    end; 

更新:嗯,我做我的代碼更簡單,但我仍然有00902錯誤「無效數據類型」。我在下面顯示的新代碼:

 create or replace package PKG_BORROW as 
    type adv_head_tab is table of ADVERTISEMENT%ROWTYPE; 
    function get_adv_header_filter 
    return adv_head_tab; 

    end ; 

/
    create or replace package body PKG_BORROW 
    as 

    function get_adv_header_filter 
    return adv_head_tab as 
    l_tab adv_head_tab := adv_head_tab(); 
    query varchar2(500); 
    TYPE CurTyp IS REF CURSOR; 
    v_adv_cursor CurTyp; 

begin 
    query:='select * from ADVERTISEMENT'; 

    open v_adv_cursor for query; 

    fetch v_adv_cursor bulk collect into l_tab; 

    close v_adv_cursor; 


    for rec in 1..l_tab.count 
    loop   
    dbms_output.put_line(l_tab(rec).title); 
    end loop; 

    return l_tab; 
    end; 
end ; 

/
    select * from TABLE(PKG_BORROW.get_adv_header_filter); 

有關無效數據類型的錯誤依然存在。

+0

PL/SQL表不是遊標。 – OldProgrammer

回答

0

您的功能有問題。您正在嘗試將遊標值插入到循環中的集合中。你需要做批量收集。如下所示:

function get_adv_header_filter 
    (title varchar2,username varchar2,regionName varchar2,categoryName varchar2) 
    return adv_head_tab as 
    l_tab adv_head_tab := adv_head_tab(); 
    query varchar2(500); 
    TYPE CurTyp IS REF CURSOR; 
    v_adv_cursor CurTyp; 

    begin 
    query:='select a.id_advertisement,a.title,a.date_added,a.id_user,r.name,i.id_item_category from advertisement a,region r,item_category i 
    where a.id_region=r.id_region and a.id_item_category=i.id_item_category '; 

    open v_adv_cursor for query; 

    fetch v_adv_cursor bulk collect into l_tab; 

    close v_adv_cursor; 


    for rec in 1..l_tab.count 
    loop   
    dbms_output.put_line(l_tab(rec).title); 
    end loop; 

    return l_tab; 
    end; 
+0

感謝您的回答 - 您的固定代碼有效。我還有其他問題 - 你是否看到我的代碼底部的選擇?此選擇的執行不會運行 - >無效的數據類型錯誤,所以我不能運行它。函數調用中的參數並不重要 - 只是我想運行這種類型的選擇。當我將結構放在模式級別時,我遇到了這樣的錯誤:「不一致的數據類型:預期的%s得到%s」。提前致謝。 – mexicoman

+0

檢查您的「record」列數據類型是否與select語句中選定的列匹配。 – XING