Есть ли какой-нибудь код на SQL сервере, похожий на Oracle PIPE ROW? - PullRequest
0 голосов
/ 20 февраля 2020

Какой код похож на Oracle PIPE ROW на SQL Сервере? Я изучаю Oracle в первый раз, и только что столкнулся с "PIPE ROW" в строке кода, какая от этого польза?

1 Ответ

0 голосов
/ 20 февраля 2020

В 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 вызов для вывода любого значения, которое нам нравится. Таким образом, мы можем использовать programmati c logi c, чтобы определить вывод, например, сгенерировать список чисел от 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 .

Конвейерные функции кажутся невероятно мощной функцией, но на практике сценарии их использования довольно нишевые. Например, мы можем использовать один , чтобы разбить строку на отдельные токены , но использование regex или xslt , вероятно, быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...