[英]How to define a pipelined table function within a with statement?
可以在 with 语句中定义 function( How to define a function and a query in the same with block? )。 但是我无法在 with 语句中定义流水线 function。
WITH
FUNCTION f (a IN INTEGER)
RETURN SYS.odcinumberlist
PIPELINED
IS
ret INTEGER;
BEGIN
FOR z IN 1 .. a
LOOP
PIPE ROW (z);
END LOOP;
RETURN;
END;
SELECT * FROM f(3); --I tried with table(f(3)) too
[错误] 执行 (2:1): ORA-06553: PLS-653: PL/SQL scope 中不允许聚合/表函数
是否可以在 with 语句中定义流水线表 function 以及如何定义?
如果可能的话,我想用记录表来做到这一点。 因此,我也需要知道如何在 with 语句中定义类型。
在子查询分解子句中,您可以创建一个返回集合的非流水线 function:
WITH FUNCTION f (a IN INTEGER)
RETURN SYS.ODCINUMBERLIST
IS
v_list SYS.ODCINUMBERLIST := SYS.ODCINUMBERLIST();
BEGIN
FOR z IN 1 .. a LOOP
v_list.EXTEND;
v_list(v_list.COUNT) := z;
END LOOP;
RETURN v_list;
END f;
SELECT *
FROM TABLE(f(3));
哪些输出:
COLUMN_VALUE 1个 2个 3个
db<> 在这里摆弄
如果可能的话,我想用记录表来做到这一点。
记录是一种 PL/SQL 数据类型; 您不能在 SQL 语句中使用它。 而是使用OBJECT
数据类型并在运行查询之前在全局 SQL scope 中声明它(不,您不能在查询中本地声明它)。
因此,我也需要知道如何在 with 语句中定义类型。
同样,您不能这样做,因为 SQL 语法不允许这样做。 请参阅上一个问题的答案。
您可以全局声明它:
CREATE TYPE test_obj IS OBJECT (
w1 INTEGER
);
CREATE TYPE test_obj_table IS TABLE OF test_obj;
WITH FUNCTION f (a IN INTEGER)
RETURN test_obj_table
IS
v_list test_obj_table := test_obj_table();
BEGIN
FOR z IN 1 .. a LOOP
v_list.EXTEND;
v_list(v_list.COUNT) := test_obj(z);
END LOOP;
RETURN v_list;
END f;
SELECT *
FROM TABLE(f(3));
输出:
W1 1个 2个 3个
db<> 在这里摆弄
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.