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 中的外应用和表值函数,但这似乎完全不同 - 或者这真的是外应用吗?
它不是交叉连接的,因为管道函数是行相关的;您无法将管道函数中的第 1 行的值交叉连接到第 2 行的值,因为第 1 行的管道函数值不再存在。
如果管道函数不依赖于行——如果它脱离了静态值——我怀疑它会交叉连接。(尝试一下看看!)