Табличные функции в ORACLE 11g? (параметризованные представления) - PullRequest
11 голосов
/ 13 января 2010

Я видел дискуссии по этому поводу в прошлом, например здесь . Но мне интересно, если где-нибудь на линии, может быть, 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)

Ответы [ 3 ]

17 голосов
/ 14 января 2010

Нет необходимости для SYS_CONTEXT или определения курсора. Вам нужен тип, чтобы при синтаксическом анализе SQL он мог определить, какие столбцы будут возвращены. Тем не менее, вы можете легко написать скрипт, который будет генерировать определения типа и типа коллекции для одной или нескольких таблиц на основе данных в 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 голосов
/ 02 февраля 2012

Можно определить вид «параметризованных» представлений в Oracle. Шаги:

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

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

  1. открыть сеанс,
  2. присваивает нужные значения этим элементам пакета,
  3. SELECT данные из вида,
  4. делать другие вещи или закрывать сессию.

ЗАМЕЧАНИЕ : для пользователя важно выполнить все три шага только за один сеанс, поскольку область действия членов пакета - это точно сеанс.

0 голосов
/ 27 октября 2011

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

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

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

В приведенном выше примере (автор Гэри Майерс) создается табличная функция второго типа, и она НЕ является параметризованным представлением.

...