簡體   English   中英

Oracle跳過了嵌套的PIPELINED函數

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM