繁体   English   中英

如何在 with 语句中定义流水线表 function?

[英]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.

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