Табличные функции в ORACLE 11g?( параметризованные представления )
-
20-09-2019 - |
Вопрос
Я видел дискуссии по этому поводу в прошлом, такие как здесь.Но мне интересно, внедрил ли 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 можно определить своего рода «параметризованные» представления.Шаги:
- Определите пакет, содержащий общедоступные члены, которые на самом деле являются необходимыми параметрами (в этом пакете нет необходимости в функциях или процедурах),
- Определите представление, основанное на этих членах пакета.
Чтобы использовать этот механизм, пользователю необходимо:
- открыть сеанс,
- присвойте нужные значения этим членам пакета,
SELECT
данные из представления,- займитесь другими делами или закройте сеанс.
ЗАМЕЧАНИЕ:пользователю важно выполнить все три шага только за один сеанс, поскольку областью действия членов пакета является именно сеанс.
В SQL SERVER существует ДВА типа табличных функций:
Встроенная табличная функция:Для встроенной табличной функции нет тела функции;таблица представляет собой результирующий набор одного
SELECT
заявление.Этот тип может быть назван как "параметризованный вид", и, насколько я знаю, у него нет эквивалента в ORACLE.Многозначная табличная функция с несколькими утверждениями:Для функции с множественным табличным значением тело функции, определенное в
BEGIN...END
блок, содержащий серию инструкций Transact-SQL, которые создают и вставляют строки в таблицу, которая будет возвращена.
Приведенный выше пример (автор Гэри Майерс) создает табличную функцию второго типа, и это НЕ "параметризованное представление".