2017-10-20 20 views
0

<tablename>%ROWTYPEと宣言された引数を持つパッケージ内にパイプラインテーブル関数(t)を宣言しようとしています。その関数が宣言され、パッケージはエラーなしでコンパイルされます。%ROWTYPEで宣言されたパラメータを持つパイプライン関数

しかし、この機能を以下のような手順(p1)で使用したいと思います。

CREATE OR REPLACE PACKAGE BODY t1 
AS 
    -- private 

    PROCEDURE p1 
    IS 
     l_person persons%ROWTYPE; 
    BEGIN 
     FOR l_row IN (SELECT * 
         FROM TABLE (t (l_person))) 
     LOOP 
     NULL; 
     END LOOP; 
    END; 


    -- public 

    FUNCTION t (p_persons_record persons%ROWTYPE) 
     RETURN t_a_list 
     PIPELINED 
    IS 
     l_a t_a; 
    BEGIN 
     l_a.dummy := 'A'; 
     PIPE ROW (l_a); 
    END; 
END; 

このサンプルコードは意味を持ちませんが、私の問題を示しています。それだけでコンパイルしますが、次のエラーを与えていない :

[Error] PLS-00382 (10: 38): PLS-00382: expression is of wrong type 
[Error] PLS-00306 (10: 35): PLS-00306: wrong number or types of arguments in call to 'T' 
[Error] ORA-00904 (10: 35): PL/SQL: ORA-00904: "T1"."T": invalid identifier 

誰が悪いのか説明することができ、これらのエラーを修正する方法?

編集:

パッケージ仕様は次のとおりです。私はあなたのPACKAGE仕様がtの宣言を欠い

CREATE OR REPLACE PACKAGE t1 
AS 
    TYPE t_a IS RECORD (dummy VARCHAR2 (1)); 

    TYPE t_a_list IS TABLE OF t_a; 

    FUNCTION t (p_persons_record persons%ROWTYPE) 
     RETURN t_a_list 
     PIPELINED; 
END; 

答えて

1

であることを確認しました。したがって、rowtype属性によって派生したレコード・パラメータを持つPL/SQLファンクションは、SQLでは表関数として使用できません。 PL/SQLレコードではなく、スキーマ・レベルでSQLオブジェクトを使用するだけです。

-- adapt your columns to your table as necessary 
CREATE OR REPLACE TYPE g_persons AS OBJECT (
    ID int, 
    C1 int 
); 

CREATE OR REPLACE PACKAGE t1 
AS 
    TYPE t_a IS RECORD (dummy VARCHAR2 (1)); 

    TYPE t_a_list IS TABLE OF t_a; 

    FUNCTION t (p_persons_record g_persons_t) 
     RETURN t_a_list 
     PIPELINED; 
END; 
/

CREATE OR REPLACE PACKAGE BODY t1 
AS 
    -- private 

    PROCEDURE p1 
    IS 
     l_person g_persons_t; 
    BEGIN 

     l_person.ID := 1; -- init your record some how 
     l_person.C1 := 1; -- init your record some how 

     FOR l_row IN (SELECT * 
         FROM TABLE (t (l_person))) 
     LOOP 
     NULL; 
     END LOOP; 
    END; 


    -- public 

    FUNCTION t (p_persons_record g_persons_t) 
     RETURN t_a_list 
     PIPELINED 
    IS 
     l_a t_a; 

    BEGIN 
     l_a.dummy := 'A'; 
     PIPE ROW (l_a);  
    END; 

END; 
/
0

と思います。あなたはPACKAGE仕様はこれに似た何か?:あなたはSQLスコープでレコードタイプを使用することはできません

CREATE OR REPLACE PACKAGE t1 AS 
    PROCEDURE p1; 
    FUNCTION t (p_persons_record persons%ROWTYPE) RETURN t_a_list PIPELINED; 
END; 
+0

申し訳ありませんが、私はパッケージ仕様を削除しました。私はそれを明確にするために質問に追加します。 –

関連する問題