簡體   English   中英

使用%ROWTYPE聲明參數的流水線函數

[英]Pipelined function with a parameter declare with %ROWTYPE

我正在嘗試在一個接受聲明為<tablename>%ROWTYPE的參數的包中聲明一個流水線表函數( t )。 聲明該函數有效,並且程序包編譯無任何錯誤。

但是我想在下面所示的過程( 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

誰能解釋什么地方出了問題以及如何解決這些錯誤?

編輯:

套件規格為:

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;

您不能在SQL范圍中使用記錄類型。 因此,具有由rowtype屬性派生的記錄參數的PL / SQL函數不能用作SQL中的表函數。 您唯一需要重寫的就是在架構級別使用SQL對象而不是PL / 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;
/

我認為您的PACKAGE規范缺少t的聲明。 您是否檢查過PACKAGE規范是否與此相似?:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM