Табличные функции в 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)
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
блок, содержит серию операторов Transact-SQL, которые строят и вставляют в таблицу строки, которые будут возвращены.
Приведенный выше пример (автор Гэри Майерс) создает табличную функцию второго типа, и она НЕ является "параметризованным представлением".