帮助使用 Oracle Pipelined 函数

Cad*_*oux 5 oracle oracle-10g pivot

我有一个支点,其中我与坦克编号签订了合同,以 ; 分隔。我已经得到了这个例子来将它们向下旋转成行(有效):

SELECT oks_c.contract_number, 
       oks_l.line_id,
       oks_l.tank_numbers, column_value AS TANK_NUMBER 
  FROM oks_contract_header oks_c
 INNER JOIN oks_contract_lines oks_l 
    ON oks_l.contract_number = oks_c.contract_number AND 
       oks_l.item_name LIKE '%.55201'
    , table(str2tbl(oks_l.tank_numbers,';')) acbb
ORDER BY oks_c.contract_number, 
         oks_l.line_id, 
         TANK_NUMBER
Run Code Online (Sandbox Code Playgroud)

这是流水线函数:

CREATE OR REPLACE function DBRAJAH.str2tbl( p_str in varchar2, p_delim in varchar2 default ',' ) return 
str2tblType
PIPELINED
as
    l_str      long default p_str || p_delim;
    l_n        number;
begin
    loop
        l_n := instr( l_str, p_delim );
        exit when (nvl(l_n,0) = 0);
        pipe row( ltrim(rtrim(substr(l_str,1,l_n-1))) );
        l_str := substr( l_str, l_n+1 );
    end loop;
    return;
end;
Run Code Online (Sandbox Code Playgroud)

但我试图理解它为什么有效。特别是流水线函数结果如何不交叉连接?

我熟悉 SQL Server 中的外应用和表值函数,但这似乎完全不同 - 或者这真的是外应用吗?

Ada*_*sch 1

它不是交叉连接的,因为管道函数是行相关的;您无法将管道函数中的第 1 行的值交叉连接到第 2 行的值,因为第 1 行的管道函数值不再存在。

如果管道函数不依赖于行——如果它脱离了静态值——我怀疑它会交叉连接。(尝试一下看看!)