【发布时间】:2020-02-20 16:51:46
【问题描述】:
哪段代码与 SQL Server 中 Oracle 的 PIPE ROW 类似?第一次学Oracle,刚遇到一串代码中的“PIPE ROW”,有什么用?
【问题讨论】:
-
T-SQL 中的表值函数能解决您的问题吗?
哪段代码与 SQL Server 中 Oracle 的 PIPE ROW 类似?第一次学Oracle,刚遇到一串代码中的“PIPE ROW”,有什么用?
【问题讨论】:
在 Oracle 中,函数是一个返回值的存储过程:
create or replace function get_number
return number is
begin
return 42;
end;
/
select get_number
from dual
/
但返回值不必是标量。如果它是一个嵌套表,我们可以使用 table() 函数访问它,并将其视为查询的 FROM 子句中的实际表:
create or replace function get_numbers
return sys.odcinumberlist is
begin
return sys.odcinumberlist (23, 42);
end;
/
select *
from table(get_numbers)
/
但如果函数是流水线函数,我们可以使用pipe row 调用来输出我们喜欢的任何值。因此我们可以使用编程逻辑来确定输出,例如生成从1 到n 的数字列表:
create or replace function get_n_numbers (p_n in number)
return sys.odcinumberlist pipelined is
begin
for n in 1..p_n loop
pipe row(0+n);
end loop;
return;
end;
/
select *
from table(get_n_numbers(3))
/
这是db<>fiddle上的演示。
流水线函数似乎是一个非常强大的功能,但实际上它们的用例相当小众。例如,我们可以使用to split a string into distinct tokens,但使用regex 或xslt 可能更快。
【讨论】: