【问题标题】:Is there any code on SQL Server similar to Oracle's PIPE ROW?SQL Server 上是否有类似于 Oracle 的 PIPE ROW 的代码?
【发布时间】:2020-02-20 16:51:46
【问题描述】:

哪段代码与 SQL Server 中 Oracle 的 PIPE ROW 类似?第一次学Oracle,刚遇到一串代码中的“PIPE ROW”,有什么用?

【问题讨论】:

标签: sql oracle


【解决方案1】:

在 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 调用来输出我们喜欢的任何值。因此我们可以使用编程逻辑来确定输出,例如生成从1n 的数字列表:

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,但使用regexxslt 可能更快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    • 2019-01-07
    相关资源
    最近更新 更多