如何在 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
子句限制行数。
我在 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
子句限制行数。