Табличные функции в 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)
648   3  

3 ответов:

Нет необходимости в определениях 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));

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

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.