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

StackOverflow https://stackoverflow.com/questions/2059299

Вопрос

Я видел дискуссии по этому поводу в прошлом, такие как здесь.Но мне интересно, внедрил ли ORACLE где-нибудь на этом пути, возможно, 10g или 11g (мы используем 11g), какую-либо лучшую поддержку "параметризованных представлений", без необходимости заполнять базу данных всевозможными пользовательскими типами и / или определениями курсора или переменными 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)
Это было полезно?

Решение

Нет необходимости в 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, которые создают и вставляют строки в таблицу, которая будет возвращена.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top