如何在 PL/SQL Developer 中调试流水线函数?

How to debug a pipelined function in PL/SQL Developer?

我在 oracle 数据库中有一个 PL/SQL 包,其中包含一个名为 FN_GET_USERINFO_ROWS 的管道函数,如下所示:

CREATE OR REPLACE PACKAGE PKG_USERINFO AS

  TYPE TY_USERINFO_RECORD IS RECORD( U_ID    VARCHAR2(50),
                                     U_NAME  VARCHAR2(50),
                                     DOB     DATE);     
  TYPE TY_USERINFO_TABLE IS TABLE OF TY_USERINFO_RECORD;


  FUNCTION FN_GET_USERINFO_ROWS(P_USER_ID IN NUMBER)
    RETURN TY_USERINFO_TABLE PIPELINED;

END PKG_USERINFO;

我 运行 正在按照测试脚本在 PL/SQL Developer[=31= 处测试流水线 FN_GET_USERINFO_ROWS ] (文件->新建->测试Window)

declare
  result PKG_USERINFO.TY_USERINFO_TABLE;
begin
  -- calling pipelined function
  result := PKG_USERINFO.FN_GET_USERINFO_ROWS(P_USER_ID => :P_USER_ID);
end;

但它显示以下错误:

ORA-06550: line 28, column 12: PLS-00653: aggregate/table functions are not allowed in PL/SQL scope

如何使用 PL/SQL Developer 调试流水线函数?

其中一种方法是使用 FOR-SELECT-LOOP 创建一个块并在函数中放置一个断点,或者只记录每个获取行的内容(取决于调试的含义)。因此,您可以将每个 PIPE ROW 执行分开并查看其结果。
然后在 PL/SQL Dev 中选择 File->Open- >TestScript 和 运行 从打开的块 window.

DECLARE      
  result pkg_userinfo.ty_userinfo_table;
BEGIN
  -- we call pipelined functions like this

  FOR rec IN (SELECT *
                FROM TABLE (pkg_userinfo.fn_get_userinfo_rows(:P_USER_ID))
            -- WHERE rownum < 2
            -- uncomment this line and vary amount of fetched rows
             )
  LOOP
    dbms_output.put_line('another step : ' || rec.u_id);
  END LOOP;

END;

另外,我建议您在抛出 NO_DATA_NEEDED 时调试变体。为此添加 WHERE 子句限制行数。