Возвращающие табличное значение функции в Oracle 11г? (параметризованные представления)
Я видел дискуссии об этом в прошлом, такие как здесь. Но мне интересно, если где-то вдоль линии, возможно, 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 ответов
нет необходимости в определениях 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 можно определить своего рода "параметризованные" представления. Шаги:
- определите пакет, содержащий как открытые члены, которые на самом деле являются необходимыми параметрами (в этом пакете нет необходимости в функциях или процедурах),
- определите представление, основанное на элементах этого пакета.
использовать этот механизм один пользователь должен:
- открыть сеанс,
- присвоить нужные значения члены пакета,
-
SELECT
данные из представления, - сделайте другие вещи или закройте сеанс.
Примечание: важно, чтобы пользователь сделал все три шага только за один сеанс, поскольку область членов пакета является точно сеансом.
в SQL SERVER существует два типа табличных функций:
встроенная табличная функция: для встроенной табличной функции нет тела функции; таблица является результирующим набором одного
SELECT
заявление. Этот тип можно назвать "параметризованный вид", и он не имеет эквивалента в ORACLE, как я знаю.многозначная табличная функция: для многозначной табличной функции тело функции, определенное в а
BEGIN...END
block содержит ряд инструкций Transact-SQL, которые строят и вставляют строки в возвращаемую таблицу.
приведенный выше образец (Гэри Майерс) создает табличную функцию второго типа, и это не "параметризованное представление".