簡體   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