简体   繁体   English

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

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

I have a PL/SQL package in oracle database which contains a pipelined function named FN_GET_USERINFO_ROWS as bellow: 我在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;

And I'm running following test script to test pipelined FN_GET_USERINFO_ROWS at PL/SQL Developer ( File->New->Test Window ) 我正在运行以下测试脚本来测试PL / SQL Developer上的流水线FN_GET_USERINFO_ROWS文件 - >新建 - >测试窗口

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;

But it is showing following error: 但它显示以下错误:

ORA-06550: line 28, column 12: PLS-00653: aggregate/table functions are not allowed in PL/SQL scope ORA-06550:第28行,第12列:PLS-00653:PL / SQL范围内不允许使用聚合/表函数

How can I debug a pipelined function using PL/SQL Developer ? 如何使用PL / SQL Developer调试流水线函数?

One of the ways is to create a block with FOR-SELECT-LOOP and put a breakpoint into the function or just log contents for each fetched row (depends on what you mean by debugging). 其中一种方法是使用FOR-SELECT-LOOP创建一个块并将断点放入函数中,或者只记录每个读取行的内容(取决于调试的含义)。 So you can separate each PIPE ROW execution and see its results. 因此,您可以分离每个PIPE ROW执行并查看其结果。
Then in PL/SQL Dev choose File->Open->TestScript and run the block from opened window. 然后在PL / SQL Dev中选择File-> Open-> TestScript并从打开的窗口运行块。

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;

Also I advise you to debug variants when NO_DATA_NEEDED is being thrown. 另外,我建议你在抛出NO_DATA_NEEDED时调试变体。 To do it add WHERE clause limiting number of rows. 为此,添加WHERE子句限制行数。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM