2016-06-15 7 views
0

レコードのテーブルを返す関数を作成する必要があります。フィルタリングは、関数のINパラメータに基づいて実行されます。テーブルからレコードのテーブルに値をフェッチする方法

一般的に、それは非常に簡単に次のコードを実行される:

CREATE TABLE TABLE_A 
(
    TEST_1 NUMBER 
, TEST_A VARCHAR2(1 BYTE) 
, TEST_B VARCHAR2(1 BYTE) 
) ; 



Insert into TABLE_A (TEST_1,TEST_A,TEST_B) values (1,'a','b'); 
Insert into TABLE_A (TEST_1,TEST_A,TEST_B) values (2,'a','b'); 


create or replace package test_package as 
    type rec is record 
     (t1 table_a.test_1%type 
     , t2 table_a.test_a%type 
     , t3 table_a.test_b%type 
    ); 


    TYPE col_table_1 is table of rec; 

    function test_plsql_table(par1 varchar2) return col_table_1 pipelined; 

end; 


create or replace package body test_package as 

    function test_plsql_table(par1 varchar2) return col_table_1 PIPELINED as 

    cursor temp_cur is 
     SELECT * FROM table_a where test_a = par1; 
    begin 
    for cur_rec in temp_cur loop 
     pipe row(cur_rec); 
    end loop; 
    end; 
end; 

SELECT * from TABLE(test_package.test_plsql_table('a')); 

が、私は新しいT0を追加

... 
    type rec is record 
     (t0 UROWID 
     , t1 table_a.test_1%type 
     , t2 table_a.test_a%type 
     , t3 table_a.test_b%type 
    ); 
... 

にRECレコードの構造を変更する場合の問題が提起します列UROWIDがエラーを生成する場合:

PLS-00630: pipelined functions must have a supported collection return type

どうすれば解決できますか それ?

ありがとうございます。

+0

'テーブルA'を変更する必要があり、新しい' t0'が – piyushj

答えて

0
PLS-00630:  pipelined functions must have a supported collection return type. 

原因:サポートされていない戻り型のパイプライン関数が指定されました。以下では、パイプラインの関数の戻り値の型としてサポートnotです:

- non-collections, 

- PL/SQL tables, 

- associative arrays, 

- collections of PL/SQL types: rowid, mlslabel, long, long raw, boolean, binary_integer, pls_integer, string and urowid 

次の制限が適用されます。

- If the return type is a collection of records, then each of the attributes of the record must be a supported type. 

    - A collection of records must not contain a record type as one of its attributes. 

処置:パイプライン化された関数の戻り値の型としてサポートされるコレクション型を指定します。

ドキュメンテーション: - https://community.oracle.com/thread/2375082?tstart=0

+0

はい、確かに、PIPELINEDオプションがUROWIDのdataypeを返すことはできません追加する必要があります。このオプションを使わなくても自分の仕事を達成する方法はありますか?あなたは私にヒントを与えることができますか? – mikcutu

0

私は下の図は、問題を克服するのに役立ちます願っています。

--Table Creation 
CREATE TABLE TABLE_A 
    (
    TEST_1 NUMBER , 
    TEST_A VARCHAR2(1 BYTE) , 
    TEST_B VARCHAR2(1 BYTE) 
) ; 

--Data Insertion 
INSERT INTO TABLE_A 
    (TEST_1,TEST_A,TEST_B 
) VALUES 
    (1,'a','b' 
); 
INSERT INTO TABLE_A 
    (TEST_1,TEST_A,TEST_B 
) VALUES 
    (2,'a','b' 
); 

    CREATE OR REPLACE TYPE REC IS OBJECT 
    (
    t1 NUMBER, 
    t2 VARCHAR2(1) , 
    t3 VARCHAR2(1) , 
    t0 VARCHAR2(100)); --This can handle the ROWID part too 


CREATE OR REPLACE TYPE REC_TAB IS TABLE OF REC; 

CREATE OR REPLACE PACKAGE test_package 
AS 
    FUNCTION test_plsql_table 
    (
     par1 VARCHAR2 
    ) 
    RETURN REC_TAB; 
END; 

SHOW ERROR; 


CREATE OR REPLACE PACKAGE body test_package 
AS 
FUNCTION test_plsql_table 
    (
    par1 VARCHAR2 
) 
    RETURN REC_TAB 
AS 
lv_tab REC_TAB; 
BEGIN 
    SELECT rec(test_1,test_a,test_b,ROWID) BULK COLLECT INTO lv_tab FROM TABLE_A 
    WHERE test_a = par1; 
    RETURN lv_tab; 
END; 
END; 

--Function execution 
SELECT * FROM TABLE(test_package.test_plsql_table('a')); 
+0

まあ、要件は:1つの列UROWIDする必要があります使用する必要がありますRECORDsのテーブル – mikcutu

+0

だから、ROWIDをUROWIDデータ型に入れたいですか?そうですか? –

+0

はい、そうです。また、RECORDsのテーブル – mikcutu

関連する問題