【问题标题】:How to debug a pipelined function in PL/SQL Developer?如何在 PL/SQL Developer 中调试流水线函数?
【发布时间】:2016-02-01 10:42:20
【问题描述】:

我在 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;

我正在运行以下测试脚本来测试流水线 FN_GET_USERINFO_ROWSPL/SQL DeveloperFile->New->Test 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:第 28 行,第 12 列:PLS-00653:聚合/表函数 在 PL/SQL 范围内是不允许的

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

【问题讨论】:

    标签: oracle plsql plsqldeveloper


    【解决方案1】:

    其中一种方法是使用FOR-SELECT-LOOP 创建一个块并在函数中放置一个断点,或者只记录每个获取的行的内容(取决于您的调试含义)。因此,您可以分离每个 PIPE ROW 执行并查看其结果。
    然后在 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;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-16
      • 2021-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-08
      • 1970-01-01
      相关资源
      最近更新 更多