Табличные функции в ORACLE 11g? (параметризованные виды)

Я видел обсуждения в прошлом, такие как здесь. Но мне интересно, если где-то вдоль линии, может быть, 10g или 11g (мы используем 11g), ORACLE ввела любую лучшую поддержку "параметризованных представлений", не забирая базу данных всеми видами пользовательских типов и/или определения курсора или переменные sys_context.

Я надеюсь, что ORACLE добавила поддержку чего-то, что просто "просто работает", как показано в следующем примере в T-SQL:

CREATE FUNCTION [dbo].[getSomeData] (@PRODID ROWID)  
RETURNS TABLE AS  
    RETURN SELECT PRODID, A, B, C, D, E  
    FROM MY_TABLE  
    WHERE PRODID = @PRODID

Затем просто выберите его так:

SELECT * FROM dbo.getSomeData(23)

Ответ 1

Нет необходимости в SYS_CONTEXT или определениях курсора. Вам нужен тип, чтобы при анализе SQL он мог определить, какие столбцы будут возвращены. Тем не менее, вы можете легко написать script, который будет генерировать определения типов и типов коллекций для одной или нескольких таблиц на основе данных в user_tab_columns.

Ближайшим является

create table my_table
(prodid number, a varchar2(1), b varchar2(1), 
  c varchar2(1), d varchar2(1), e varchar2(1));

create type my_tab_type is object
(prodid number, a varchar2(1), b varchar2(1), 
  c varchar2(1), d varchar2(1), e varchar2(1))
.
/

create type my_tab_type_coll is table of my_tab_type;
/

create or replace function get_some_data (p_val in number) 
return my_tab_type_coll pipelined is
begin
  FOR i in (select * from my_table where prodid=p_val) loop
    pipe row(my_tab_type(i.prodid,i.a,i.b,i.c,i.d,i.e));
  end loop;
  return;
end;
/

SELECT * FROM table(get_Some_Data(3));

Ответ 2

В Oracle можно определить своего рода "параметризованные" представления. Шаги:

  • Определите пакет, содержащий как общедоступные элементы, которые на самом деле являются необходимыми параметрами (нет необходимости в функциях или процедурах в этом пакете),
  • Определить представление, основанное на этом члене пакета.

Чтобы использовать этот механизм, один пользователь должен:

  • откройте сеанс,
  • назначить требуемые значения этим членам пакета,
  • SELECT данные из представления,
  • делать другие вещи или закрывать сеанс.

Замечание: важно, чтобы пользователь выполнял все три шага только в одном сеансе, поскольку область элементов пакета - это точно сеанс.

Ответ 3

В SQL SERVER существует два типа табличных функций:

  • Встроенная функция, учитывающая таблицу: для встроенной табличной функции нет тела функции; таблица представляет собой набор результатов одного оператора SELECT. Этот тип можно назвать "параметризованный вид", и он не имеет эквивалента в ORACLE, как я знаю.

  • Функция многозначной таблицы: для функции с множеством табличных функций тело функции, определенное в блоке BEGIN...END, содержит ряд операторов Transact-SQL, которые строят и вставляют строки в таблицу, которая будет возвращаться.

Приведенный выше пример (Gary Myers) создает табличную функцию второго типа и НЕ является "параметризованным представлением".