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