2016-12-29 3 views
0

テーブルを返す関数に問題があります。しかし、この関数を実行したいときは、 "不正なデータ型"というエラーが返されます。とにかくパッケージは正しくコンパイルされています。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; 

UPDATE:

はここに私のコードですさて、私は私のコードが簡単になるが、それでも私は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

あなたの答えをありがとう - あなたの固定コードが動作します。私は他の質問があります - あなたは私のコードの下の部分で選択を見ましたか?この選択の実行は実行されません - >無効なデータ型エラー、私はそれを実行することはできません。関数呼び出しの引数は重要ではありません。このタイプのselectを実行したいだけです。私が私の構造をスキーマレベルに置くと、 "一貫性のないデータ型:%sに%sがあります"というエラーが発生します。前もって感謝します。 – mexicoman

+0

'record'カラムのデータ型がselect文で選択されているカラムと一致するかどうかを確認してください。 – XING

関連する問題