11

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

Я надеюсь, что, может быть добавлена ​​поддержка 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) 
+0

Я надеялся на то же самое ... – craig

ответ

17

Нет необходимости в 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)); 
+1

Хороший ответ (бродячий «.» В my_tab_type create). Стоит сказать, что это работает в 10г. –

+0

Не соответствует требованиям «без необходимости засорять базу данных с требованиями всех видов пользовательских типов». – craig

-1

Есть два типа таблиц-функций в SQL SERVER:

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

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

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

+4

вопрос о ORACLE –

2

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

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

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

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

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