[英]Nested PIPELINED function is skipped by Oracle
我將發布一個簡單的示例,該示例實際上是有效的,只是為了大致了解我要實現的目標:
這是“內部”函數,該函數從某個表中獲取數據,該表稱為test_tab
:
create or replace function test_inner RETURN num_typ PIPELINED
IS
BEGIN
FOR cur in (
SELECT x FROM test_tab
)
LOOP
PIPE ROW(cur.x);
END LOOP;
END;
/
這是“外部”函數,它使用inner
函數的結果並對它們進行適當的轉換:
create or replace function test_outer RETURN num_typ PIPELINED
IS
BEGIN
FOR x IN (
SELECT * FROM table(test_inner())
)
LOOP
PIPE ROW(x.column_value * 2);
END LOOP;
END;
/
這是我的用法:
begin
execute immediate 'insert into test_tab(x) values(1)';
execute immediate 'insert into test_tab(x) values(2)';
execute immediate 'insert into test_tab(x) values(3)';
FOR x IN (
select * from table(test_outer())
) LOOP
DBMS_OUTPUT.put_line(x.column_value);
END LOOP;
end;
/
問題是test_inner
函數似乎被Oracle忽略了。 當單獨調用它時,它“看到”在執行之前插入的數據。 但是當它作為test_outer
的一部分被調用時,它不會返回任何數據,或者根本不會被調用。
就像我說的那樣,上面的示例將起作用。 但是我的情況有點復雜,所以我不能完全發表。
您發布的測試用例無法重現您聲稱看到的問題。 因此,這不是測試用例。
@AlexPoole還為您提供了其他一些想法。 基本上,除非您不能發布更好的測試用例,否則我們將無能為力,因為您無法發布全部內容(而且我們不想遍歷數百行其他人的拙劣代碼-我只想得到足夠多的內容)調試我自己的東西)。
產生一個不良的測試案例並沒有浪費時間。 至少您可以排除某些情況:與一個管道函數調用另一個無關。 因此,這顯然是您特定實現中的東西。 也許不是內部函數邏輯中的內容,而是它們的調用方式,與它們一起使用的數據或基礎結構的其他部分。
您所要做的就是分析各個部分。 從核心組件開始,然后進行擴展,添加其他組件,直到發現有問題的地方。 是的,這是一件繁瑣的工作。 但是從您的評論看來,您已經很完整地完成了此過程。
我將其標記為CW,因為它不是問題的答案,只是擴展的注釋。
實際上,這兩個流水線函數在語法上都是錯誤的:您缺少RETURN
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.